类中一个求并集的成员函数
- C/C++ code
IntSet union2(const IntSet& s) const//计算集合的并集 { IntSet bing;//并集先初始化为s bing.num=s.num; bing.sum=new int[s.num]; for(int i=0;i<s.num;i++) { bing.sum[i]=s.sum[i]; } for(int i=0;i<num;i++) { int j=0; for(;j<s.num;j++) { if(s.sum[j]==sum[i]) break; } if(j==s.num&&s.sum[j-1]!=sum[i]) bing.insert(sum[i]);//若sum[i]未在s.sum中出现过则将其加入并集 } return bing; }
我一步步的进行调试时发现,在return句前,bing里的值还是正确的,但一运行return立刻变成很怪的值,我猜是不是因为返回了局部变量的地址造成的。但是函数首部要求不能改变两集合的值,我只能在里面新造一个集合啊。郁闷死了。
[解决办法]
- C/C++ code
IntSet bing;//并集先初始化为s//不能把这句放到函数外面吗? 函数里面初始化或者其他什么操作
[解决办法]
IntSet的构造函数,析构函数,还有拷贝构造函数分别是什么样的?
问题应该出在这些函数里
[解决办法]
问题在你的拷贝构造函数没有把内存复制到新的对象里。
在返回之前,你的零时变量是有内容的。由于你返回了局部变量值,而不是引用,所以会c++会调拷贝构造函数,把内容sum的指针传给上层对象,但问题是传递完之后局部对象会被析构,而析构将delete [] sum. 这时你上层的对象是公用同一个sum的,所以你上层对象在函数返回后(局部变量析构后)会得到一个被delete的指针。
修改拷贝构造函数应该就可以了
IntSet(const IntSet& s)
{
num=s.num;
sum=new int[num];
for (int i=0; i<s.num; i++)
sum[i] = s.sum[i];
}