Возвращение копии объекта Object в С++

Итак, я искал эту проблему, и я искал переполнение стека, но я не могу найти хороший ответ. Итак, я задаю здесь вопрос, который особенно касается моей проблемы. Если это простой ответ, пожалуйста, будьте милы, я новичок в языке. Вот моя проблема:

Я пытаюсь написать метод для класса С++, который перегружает оператор. Я хочу вернуть копию модифицированного экземпляра, но не сам экземпляр. Для удобства примера я использую класс BigInt, чтобы продемонстрировать проблему, которая у меня есть.

Если бы у меня был следующий код:

const BigInt & operator+() const //returns a positive of the number
{
    BigInt returnValue = *this;  //this is where I THINK the problem is
    returnValue.makepositve();   //for examples sake
    return returnValue;
}

Я получаю ошибку, что возвращаемое значение могло быть создано в стеке. Я знаю, что это означает, что я должен создать объект в куче и вернуть ссылку. Но если бы я изменил строку 3 rd на что-то вроде:

BigInt & returnValue = *this;

Я получаю сообщение о том, что синтаксис неверен. Я не совсем уверен, что делать, любая помощь очень ценится!

Ответ 1

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

Ваша функция будет выглядеть так:

BigInt operator+() const //returns a positive of the number
{
    BigInt returnValue = *this;
    returnValue.makepositve();   //for examples sake
    return returnValue;
}

Ответ 2

Вы также можете сделать возвращаемое значение оператора BigInt. Тогда конструктор копирования будет автоматически выполнен по возврату:

const BigInt operator+() const //returns a positive of the number
{
    BigInt returnValue = *this;  //this is where I THINK the problem is
    returnValue.makepositve();   //for examples sake
    return returnValue;
}

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

Ответ 3

Мой С++ немного ржавый, но как насчет:

BigInt* returnValue = new BigInt(this)
...
return *returnValue;

Ответ 4

Обратите внимание, что перегруженные операторы должны иметь интуитивную семантику. Определение унарного + означает "абсолютное значение", как и в приведенном ниже примере кода, очень запутывает клиентов. Операторы на пользовательских типах должны вести себя как на встроенных типах. Например, +(-5) дает -5, а не +5. Таким образом, ваша реализация operator+ должна выглядеть так:

BigInt& operator+() //returns the unchanged number
{
    return *this;
}

const BigInt& operator+() const //returns the unchanged number
{
    return *this;
}

Если вы хотите предоставить функцию абсолютного значения, сделайте следующее:

BigInt abs(BigInt x)
{
    x.makePositive();
    return x;
}

Ответ 5

попробуйте

BigInt * returnValue = this;