Возвращение копии объекта Object в C ++ - PullRequest
10 голосов
/ 28 февраля 2010

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

Я пытаюсь написать метод для класса 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;
}

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

BigInt & returnValue = *this;

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

Ответы [ 5 ]

10 голосов
/ 28 февраля 2010

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

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

BigInt operator+() const //returns a positive of the number
{
    BigInt returnValue = *this;
    returnValue.makepositve();   //for examples sake
    return returnValue;
}
3 голосов
/ 28 февраля 2010

Вы могли бы также сделать возвращаемое значение оператора 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;
}

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

0 голосов
/ 28 февраля 2010

Обратите внимание, что перегруженные операторы должны иметь интуитивно понятную семантику. Определение унарного + в значении «абсолютное значение», как вы делаете в приведенном примере кода, крайне запутывает клиентов. Операторы на пользовательских типах должны вести себя как на встроенных типах. Например, +(-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;
}
0 голосов
/ 28 февраля 2010

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

BigInt* returnValue = new BigInt(this)
...
return *returnValue;
0 голосов
/ 28 февраля 2010

попробуй

BigInt * returnValue = this;
...