首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

类中一个求并集的成员函数,该如何处理

2012-05-30 
类中一个求并集的成员函数C/C++ codeIntSet union2(const IntSet& s) const//计算集合的并集{IntSet bing

类中一个求并集的成员函数

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];
}

热点排行