不理解对应位置的报错原因

该题是求两个集合的并集。
报错原因已在代码中标注,有点看不懂报错原因。
那应该怎么写呢?

用代码块功能插入代码,请勿粘贴截图
我想要达到的结果

#include
using namespace std;
class CSet
{
public:
    int n;
    int* data=NULL ;
    CSet(int n) :n(n)
    {
        data = new int[n];
    }
    CSet operator+(CSet& set);
    int datain();
};
int CSet::datain()
{
    int a[100];
    data = a;
    for (int i = 0; i < n; i++)
    {
        cin >> data[i];
    }
    return 0;
}
CSet CSet :: operator+(CSet& set)//求出A和B的并集
{
    int m;
    set.data = new int[m];
    for (int i = 0; i < n; i++)//向set.data[m]中补充
    {
        for (int j = 0; j < m; j++)
        {
            if (data[i] == set.data[j])
            {
                continue;
            }
        }
        set.data[m++] = data[i];//错误原因:写入set.data时缓冲区溢出

    }
    for (int i = 0; i < m; i++)
    {
        cout << set.data[i] << " " << endl;//错误原因:正在从set.data读取无效数据
    }
    return set;
}
int main()
{
    int n1, n2;
    cin >> n1 >> n2;
    CSet A(n1), B(n2);
    A.datain();
    B.datain();
    A.operator+(B);

    return 0;
}

修改后的代码,修改原因写在注释里了,后面有执行结果。


#include <iostream> //第一行补齐头文件
using namespace std;
class CSet
{
public:
    int n;
    int* data=NULL ;
    CSet(int n) :n(n)
    {
        data = new int[n];
    }
    CSet operator+(CSet& set);
    int datain();
};
int CSet::datain()
{
    //这个数组是栈内存,data是类的指针,已经在构造函数中data = new int[n];申请过内存了
    //栈内存,退出函数就无效了,所以这样写打印出的是乱码。
    //int a[100];
    //data = a;
    for (int i = 0; i < n; i++)
    {
        cin >> data[i];
    }
    return 0;
}
CSet CSet :: operator+(CSet& set)//求出A和B的并集
{
    //求并集,拿出一个B的元素,看看A里有没有,如果没有,就放入A中。有,就继续从B中再拿一个。
    //这里的意图是不是,m代表B集合的元素数量啊?
    int m = set.n;
    int count = this->n;//增加一个变量用于计算合并后的总数。
    //set.data = new int[m]; //这里的data已经在初始化时,使用int申请空间了,无需再次申请内存
    for (int i = 0; i < m; i++)//向set.data[m]中补充
    {
        int j = 0;
        for (j = 0; j < n; j++)
        {
            if (data[j] == set.data[i])//a == b
            {
                //如果有相同的元素,就无需在比了,直接退出,有相同元素
                break;
            }
        }
        if(j < n) continue;
        //这里不考虑溢出问题,就没问题。
        if(count < 100){
            data[count++] = set.data[i];//错误原因:写入set.data时缓冲区溢出
        }else{
            break;
        }
    }
    this->n = count;
    for (int i = 0; i < count; i++)
    {
        cout << data[i] << " " << endl;//错误原因:正在从set.data读取无效数据
    }
    return *this;
}
int main()
{
    int n1, n2;
    cout << "input A count" << endl;
    cin >> n1;
    cout << "input B count" << endl;
    cin >> n2;
    CSet A(n1), B(n2);
    cout << "input A" << endl;
    A.datain();
    cout << "input B" << endl;
    B.datain();
    cout << "A+B=" << endl;
    A.operator+(B);
    return 0;
}

input A count
2
input B count
3
input A
1
2
input B
2
3
4
A+B=
1
2
3
4

你这个重载+是一个比较特殊的,不是单纯的int类型的数值相加,这里你会扩充数组的大小,看出你这里重载这个求A和B的并集思路是不对的。

建议你不要一步到位,试试用函数传递两个参数,就是这两个A,和B,求并集成功后,再来试试这个重载加号。

这里你思路乱了,先理清楚并集的实现

img

好像内存申请可以扩展的,那个接口你查一下,正常思路就是先可以申请一个两个数组大小和的大小,重新计算存储进去