Возврат копии самого объекта в C++
хорошо, поэтому я погуглил эту проблему, и я искал переполнение стека, но я не могу найти хороший ответ. Итак,я задаю здесь вопрос, который относится к моей проблеме. Если это простой ответ, Пожалуйста, будьте любезны, я новичок в этом языке. Вот моя проблема:
Я пытаюсь написать метод для класса C++, который перегружает оператор. Я хочу вернуть копию измененного экземпляра, но не сам экземпляр. Для простоты примера, я буду использовать 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;
}
Я получаю ошибку, что возвращаемое значение может быть создан на стеке. Я знаю, что это означает, что я должен создать объект в куче и вернуть ссылку. Но если бы я изменил 3rd строка к чему-то вроде:
BigInt & returnValue = *this;
Я получаю сообщение об ошибке, сообщающее мне, что синтаксис неправильный. Я не совсем уверен, что делать, любая помощь очень ценю!
5 ответов
проблема заключается в вашей сигнатуре функции. Вам действительно нужно вернуть весь объект, а не только ссылку.
ваша функция будет выглядеть так
BigInt operator+() const //returns a positive of the number
{
BigInt returnValue = *this;
returnValue.makepositve(); //for examples sake
return returnValue;
}
вы также можете сделать возвращаемое значение оператора 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;
}
теперь похоже, что конструктор копирования произойдет дважды, один раз внутри оператора и другой, когда функция вернется, но с оптимизацией возвращаемого значения это произойдет только один раз, поэтому производительность так же хороша, как и получается.
мой C++ немного ржавый, но как насчет:
BigInt* returnValue = new BigInt(this)
...
return *returnValue;
обратите внимание, что перегруженные операторы должны иметь интуитивно понятную семантику. Определение унарных +
чтобы означать "абсолютное значение", как вы делаете в приведенном примере кода, чрезвычайно запутывает клиентов. Операторы на пользовательских типах должны вести себя как на встроенных типах. Например, +(-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;
}