Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка operator+ 
:(
    Опции темы
T0ohtik
Дата 3.5.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Пишу класс для больших чисел. А так как это числа, то надо их складывать. Реализовал перегрузку сложения. Запустил, работает. Но смущает warning: warning C4172: returning address of local variable or temporary. Ниже привожу код перегрузки:
Код

CVeryLong& CVeryLong::Add(const CVeryLong &nB)
{
   ....
   return CVeryLong(C,_msize(C)/sizeof(int));
}

Варниг выскакивает на сроке return. Ну это и понятно - мы же в методе создаем переменную, которая при выходе из метода уничтожится. Да и создавать в памяти еще одну переменную как-то не хочется, тем более она может занимать очень много памяти. Есть ли какие то методы исправления?

PM MAIL   Вверх
bronislav
Дата 3.5.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Ну оте же не перегрузка сложени, а просто член-метод класса.

Перегрузка должна быть такой
Код

CVeryLong CVeryLong::operator+(const CVeryLong& n2)
{
  и тут пишешь код
}


Заметь, что возвращение не по ссылке, потому, что если возвращать по ссылке будет возвращаться ссылка на локальную (относительно метода) переменную, которая после завершения метода уничтожиться и ссылка будет указывать в никуда.

Это сообщение отредактировал(а) bronislav - 3.5.2008, 16:01


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Rififi
Дата 3.5.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Внимательно читаем
С. Мейерс "Эффективное использование C++"
Правило 23: Не пытайтесь вернуть ссылку, когда вы должны вернуть объект.
PM MAIL   Вверх
T0ohtik
Дата 3.5.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



bronislav,  тьфу ты...  У меня с начало идет как у тебя, т.е. перегрузка сложения, а в ней вызывается функция Add. Кстати спасибо, что обратил внимание. Я задумался о нужности этой функции...

Rififi, правило перечитал, только не понял какая разница между стеком и кучей? И то и то вроде должны очищаться при выходе из метода или куча очищается позже?

PM MAIL   Вверх
JackYF
Дата 3.5.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(T0ohtik @  3.5.2008,  21:03 Найти цитируемый пост)
только не понял какая разница между стеком и кучей?

Читай учебники. Куча вообще автоматически не очищается, это забота программиста - вовремя и правильно вызвать free/delete/delete[].


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Annihilator
Дата 4.5.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(T0ohtik @  3.5.2008,  19:12 Найти цитируемый пост)
returning address of local variable or temporary

вот прикинь ты возвращаешь ссылку на локальную переменную. эта переменная разрушится при выходе из функции, ну и на что будет указывать твоя ссылка? Что толку с нее?


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2049 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.