Я пишу операторную функцию для - где мой объект класса представляет собой динамический массив целых чисел. оператор принимает объект 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
Astronautilus 21 Апр 2014 в 15:58

2 ответа

Лучший ответ

Вам нужно изменить, чтобы вернуть результат по значению.

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

Также было бы разумнее указать rhs по ссылке const при втором взгляде.

0
user2672165 21 Апр 2014 в 12:25

Придется возвращать по стоимости. Локальный объект будет уничтожен, когда функция вернется, и нет никакого способа предотвратить это.

Чтобы это сработало, ваш класс должен будет правильно следовать Правилу трех, чтобы убедиться, что он правильно копируется. В C ++ 11 или новее вы также можете рассмотреть возможность его перемещения, чтобы избежать ненужного выделения памяти и копирования (хотя в этом случае копию все равно следует исключить).

Еще лучше, следуйте правилу нуля и сохраните vector<int>, который сделает все это за вас, вместо того, чтобы пытаться манипулировать необработанными указателями.

4
Community 23 Май 2017 в 11:49