该题是求两个集合的并集。
报错原因已在代码中标注,有点看不懂报错原因。
那应该怎么写呢?
#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,求并集成功后,再来试试这个重载加号。
这里你思路乱了,先理清楚并集的实现
好像内存申请可以扩展的,那个接口你查一下,正常思路就是先可以申请一个两个数组大小和的大小,重新计算存储进去