![]() |
|
Модераторы: bsa |
![]()
|
|
| efpies |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 20.6.2009 Где: СПб Репутация: нет Всего: нет |
Здравствуйте. Столкнулся с такой проблемой: нужно как-то вернуть объект класса.
вот, что есть
При попытке вывода - Access violation, да и в значениях rows_ и cols_ мусор. Внутри Transpose всё выводит нормально, да и конструктор копирования вызывается. То ли значение возвращает Transpose? Как быть, если надо вернуть объект и присвоить его адрес указателю? |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
имхо как-то плохо выглядит.
если так
вообще-то лучше избегать прямого использования указателей и динамической памяти тем более в методах-геттерах, ведь у вас же не системное ПО, а прикладное. Это сообщение отредактировал(а) triclosan - 24.11.2010, 15:23 |
|||
|
||||
| efpies |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 20.6.2009 Где: СПб Репутация: нет Всего: нет |
Вопрос в удобстве: ведь проще объявить указатель в начале функции и потом его задействовать (хотя это плохо, говорят), чем объявить статичный объект и тут же присвоить. Может, я и ошибаюсь, конечно.
Ваша конструкция не сработала, зато сработала вот такая:
Почему это так? Я разве не возвращаю Matrix&? |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
Matrix& Matrix::Transpose() возвращает объект по ссылке.
В вашем коде получаете объект по ссылке, далее берете его адрес и пишите в указатель. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
efpies, не надо возвращать таким образом. потому что совсем не очевидно, что после этого необходимо присвоить адрес результата указателю, а в конце работы сделать delete. лучше сделай так:
Кстати, а метод Erase у тебя rows_ и cols_ случаем не обнуляет? Это сообщение отредактировал(а) bsa - 24.11.2010, 16:21 |
|||
|
||||
| WhKitten |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 24.11.2010 Репутация: нет Всего: нет |
Помоему Вы путает ссылки и указатели это разные вещи.
поэтому код:
Трактуется как: выполнить оператор присваивания для объекта Matrix по адресу d. Поскольку d неинициализированна, то это вызывает Access Violation. Мы пытаемся выполнить оператор присваивания для несуществующего объекта класса. Кстати, если бы Вы написали так:
то компилятор бы обнаружил вашу ошибку. Всегда старайтесь инициализировать переменные, как можно раньше. |
||||||||||
|
|||||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Ну ты сказал... На самом деле все проще: "присвоить объекту, находящемуся в ячейке памяти, на которую указывает d, значение возвращенное c.Transpose()". Под словом "присвоить" имеется в виду "вызвать оператор присваивания". |
|||
|
||||
| efpies |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 20.6.2009 Где: СПб Репутация: нет Всего: нет |
Нет, он просто удаляет double** values и присваивает ему NULL А что присваивать *d в таком случае? Если &(c.Transpose()), то Access violation на выводе, но rows_ и cols_ в порядке. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Если вам нужно вернуть объект и присвоить его в переменную, то так и пишите:
|
|||
|
||||
| WhKitten |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 24.11.2010 Репутация: нет Всего: нет |
Только тогда надо будет определить оператор присваивания, аналогичный копирующему конструктору, за тем исключением, что он должен ещё выполнять очистку старого значения:
Но мне кажется проблема уже в чём то другом. &(c.Transpose()) возвращает адрес переменной в куче, а если delete не вызывалось, то она должна быть проинициализирована, о чём и говорит, что rows_ и cols_ в порядке. Может во время выполнения d->Print() выполняется доступ к несуществующему индексу? Это сообщение отредактировал(а) WhKitten - 24.11.2010, 17:53 |
||||
|
|||||
| WhKitten |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 24.11.2010 Репутация: нет Всего: нет |
И ещё вариант. Вместо:
использовать:
тогда отпадёт надобность и в операторе присваивания и в копирующем конструкторе. И с указателями путаницы будет меньше. |
||||
|
|||||
| efpies |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 20.6.2009 Где: СПб Репутация: нет Всего: нет |
Ну, возможно, стоит попробовать научиться понимать их смысл, не так ли? Операция & - взять адрес, * - взять по адресу? В то же время & - ссылка, а * - указатель? Нет?
Да и вообще говоря, перегруженное сложение не вызовется, если не возвращать Matrix&, ибо not implemented. На самом деле, они были не в порядке, это моя ошибка: они становились равными 0. Оператор присваивания перегружен. Другое дело, что он вообще не вызывается, а вместо него вызывается конструктор копирования. Да и нужен ли этот оператор теперь? Что-то из них, выходит, можно убрать. В итоге получается вот что: 1. Транспонирование проходит на "ура". 2. Копирование не работает. Копируется 0, вернее. Потому что вызывается деструктор. Не оттого ли, что в Transpose объект локален? Хотя это может быть бредом. До этого, видимо, пока рановато) |
||||
|
|||||
| WhKitten |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 24.11.2010 Репутация: нет Всего: нет |
Только надо отличать, когда это & объявление ссылки, а когда взятие адреса.
|
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
Вы не правы, как раз в этом направлении стоит углублять изучение С++, а мрачных конструкций new - delete по возможности пока избегать, вы же не контроллеры программируете. Пусть вас не вводит в заблуждение, что во многих книгах по с++ для новичков new - delete рассматривается как полноценный инструмент, всему свое время. Для правильного и глубокого понимания std::* могу порекомендовать Николай Джосьютис, C++. Стандартная библиотека, Питер, 2004. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |