Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2010, 16:26   #1
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию C++ Builder функция возвращает ссылку на объект

нужно написать функцию для класса матрицы (перегрузка оператора умножение). Ее прототип такой:
Код:
Matrix & Matrix::operator*(const Matrix& M) const;
как я понял функция должна вернуть ссылку на объект С, где С = (A*B);

Как это сделать???
Я сделал вот что(хотя бы так что бы заработало):

Код:
Matrix & Matrix::operator*(const Matrix & M) const{
      Matrix C = Matrix(2,2,2);

      return C;
}
а вместо этого ошибку дают! Мол пытаюсь вернуть локальную переменную.
BleStaR вне форума Ответить с цитированием
Старый 24.06.2010, 16:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

return new Matrix(2,2,2);
?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2010, 16:42   #3
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

неработает.... выдает ошибку
Reference initialized with 'Matrix*volatile', needs lvalue of type 'Matrix'

С является результатом неких действий, и соответственно (как я понимаю) надо будет создать С определенного размера, заполнить его и вернуть ссылку.

P.S. В инфе по каторой я пишу прогу, сказано:
Объект-результат будет создаваться функцией operator* в динамической памяти, а возвращаться будет ссылка на этот объект. Таким образом, прототип функции будет иметь вид:
Matrix& Matrix:perator*(Matrix&);

как его создать в динамической памяти, и каким образом можно вернуть ссылку на эту память не через локальный объект?
BleStaR вне форума Ответить с цитированием
Старый 24.06.2010, 17:16   #4
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

больше ни у кого идей нету?
BleStaR вне форума Ответить с цитированием
Старый 25.06.2010, 10:42   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

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

Код:
Matrix Matrix::operator*(const Matrix M) {
      return Matrix(2,2,2);
}
вообще странное у вас умножение матриц))
непонятно как структура еще выглядит, там двумерный массив что ли?
Код:
Matrix& Matrix::operator*(const Matrix &M) {
             multy(this, M); //как умножать не буду писать , там перемножаются строки на столбцы=))
// *this изменяется соответственно
             return *this;
}

Последний раз редактировалось NiCola999; 25.06.2010 в 10:50.
NiCola999 вне форума Ответить с цитированием
Старый 25.06.2010, 18:03   #6
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Цитата:
не понимаю зачем здесь вобще возвращать ссылку, у вас матрица не изменяется, а просто возвращается новая.
как минимум по задаю нужно именно ссылка, а не объект. Ну а в целом, результат операции имеет временный характер (т.е. он не храниться на постоянке, а уничтожается после своего первого использования). например (A*B).show();

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

по прежнему жду ваши предложения
BleStaR вне форума Ответить с цитированием
Старый 25.06.2010, 18:28   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от BleStaR Посмотреть сообщение
как минимум по задаю нужно именно ссылка, а не объект. Ну а в целом, результат операции имеет временный характер (т.е. он не храниться на постоянке, а уничтожается после своего первого использования). например (A*B).show();

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

по прежнему жду ваши предложения
Лучше покажите задание, может вы неправильно поняли... Оператор умножения обычно возвращает новый объект, не меняя операнды. Так как ссылку/указатель на локальную переменную нельзя возвращать, то приходится возвращать по значению. Можно конечно вернуть ссылку на созданный в куче объект, но так делать не надо, будет утечка памяти.
netrino вне форума Ответить с цитированием
Старый 25.06.2010, 22:07   #8
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

netrino расскажите подробнее (а лучше пример) как можно в функции создать объект в куче и вернуть ссылку на него?

и еще на сколько я понимаю если объект будет существовать (даже в куче) то его можно и удалить с помощью деструктора и ссылки на объект. Поэтому утечки не должно быть...
BleStaR вне форума Ответить с цитированием
Старый 25.06.2010, 22:15   #9
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

По поводу задания... вот само задание задание.rar

Там я выделил красных фрагмент в котором говориться видимо о том же способе (про кучу)... ну и в самом задании судя по прототипу требуется сделать именно так.
BleStaR вне форума Ответить с цитированием
Старый 25.06.2010, 22:24   #10
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Цитата:
Matrix & Matrix :: operator*(const Matrix & M) const{
Matrix C = Matrix(2,2,2);

return C;
}
Переменная C для данной функции - локальная, и она уничтожится по мере выхода после выполнения оператора return C;
Поэтому после выхода этой переменной не будет существовать, а ссылка будет указывать на несуществующий объект, поэтому возвращать ссылку в данном случае нельзя
capta1n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция не возвращает значения 2.0 Winlook PHP 1 10.05.2010 00:58
Как сохранить ссылку на объект? TwiX Общие вопросы Delphi 8 14.12.2009 09:56
Что возвращает эта функция? D[I]K Общие вопросы C/C++ 9 07.10.2009 00:32
Возможно ли получить обработчиком событий ссылку на объект? neizerth Общие вопросы C/C++ 4 15.02.2009 11:00
Получить ссылку на вызывающий объект grenles Общие вопросы Delphi 10 07.11.2008 12:37