如何从操作符函数返回动态对象?

时间:2014-04-21 11:58:50

标签: c++ arrays class dynamic operator-keyword

我正在编写一个运算符函数 - 其中我的类对象是一个整数的动态数组。 运算符获取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;

}

2 个答案:

答案 0 :(得分:4)

你必须按价值返回。当函数返回时,本地对象将被销毁,并且无法阻止它。

为了实现这一目标,您的班级必须正确关注Rule of Three,以确保其正确可复制。在C ++ 11或更高版本中,您可能还会考虑使其可移动,以避免不必要的内存分配和复制(尽管在这种情况下,副本应该被删除)。

更好的是,遵循零规则并存储vector<int>,它将为您完成所有这些,而不是试图兼顾原始指针。

答案 1 :(得分:0)

您需要更改以按值返回结果。

IntegerSet IntegerSet::operator - (IntegerSet & rhs) const

再看一下,通过const引用提供rhs会更有意义。