我正在编写一个运算符函数 - 其中我的类对象是一个整数的动态数组。 运算符获取lhs和rhs对象并返回一个对象,该对象是lhs中的元素集,但不是rhs。
虽然我编写了该函数,但由于在返回对象后立即调用析构函数,因此无法返回该集。
IntegerSet & IntegerSet::operator - (IntegerSet & rhs) const
{
IntegerSet temp(capacity);//local object created to store the elements same size as lhs
int k=0;
int lhssize = ElementSize();//no. of elements in the set
int rhssize = rhs.ElementSize();
for (int i=0;i<lhssize;i++)
{
for (int j=0;j<rhssize;j++)
{
if (rhs.ptr[j]!=ptr[i])
{
k++;
}
}
if(k==rhssize)
{
temp = temp + ptr[i];
}
k=0;
}
return temp;
}
如果您无法理解对象,那么这是构造函数
IntegerSet::IntegerSet(const int & size)//works correctly
{
capacity = size;
ptr = new int [capacity]();
}
IntegerSet::IntegerSet(const int & size)//works correctly
{
capacity = size;
ptr = new int [capacity]();
}
IntegerSet::IntegerSet(const IntegerSet & copy) : capacity(copy.capacity)//works correctly
{
ptr = copy.clonemaker();
}
IntegerSet::~IntegerSet()
{
capacity = 0;
delete [] ptr;
}
int * IntegerSet::clonemaker() const // works correctly
{
if(ptr==NULL)
{
return NULL;
}
int *tempptr = new int [capacity];
for(int i=0;i<capacity;i++)
{
tempptr[i]=ptr[i];
}
return tempptr;
}
答案 0 :(得分:4)
你必须按价值返回。当函数返回时,本地对象将被销毁,并且无法阻止它。
为了实现这一目标,您的班级必须正确关注Rule of Three,以确保其正确可复制。在C ++ 11或更高版本中,您可能还会考虑使其可移动,以避免不必要的内存分配和复制(尽管在这种情况下,副本应该被删除)。
更好的是,遵循零规则并存储vector<int>
,它将为您完成所有这些,而不是试图兼顾原始指针。
答案 1 :(得分:0)
您需要更改以按值返回结果。
IntegerSet IntegerSet::operator - (IntegerSet & rhs) const
再看一下,通过const引用提供rhs会更有意义。