![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
gabin |
|
||||||||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Здравствуйте. Хочу сделать перегрузку оператора вывода <<.
Иерархия классов: (абстрактный)Component -> Engine -> GasEngine. Если я объявляю статический объект класса GasEngine, то вывод работает без проблем:
Но если я объявляю объект как указатель на абстрактный класс Component , то тут начинаются проблемы.
Результат:
Как сделать корректной перегрузку оператора вывода в данном случае? Исходный код проекта, сделанного в Eclipse, прикрепляю. Это сообщение отредактировал(а) gabin - 14.10.2011, 23:49 Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
||||||||
|
|||||||||
sQu1rr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Если оператор << перегружен для класса Component, то
Добавлено через 1 минуту и 43 секунды Соответственно, если нет, то что-то типо
|
||||
|
|||||
gabin |
|
||||||||||||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Оператор << перегружен для класса Engine и GasEngine. 1-й вариант не проходит, падает при выполнении:
2-й вариант с dynamic_cast при компиляции ошибка:
А вариант
Выводит что-то типа 0x9089008. Это сообщение отредактировал(а) gabin - 15.10.2011, 00:27 |
||||||||||||
|
|||||||||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Не так работать вообще не будет. Вы здесь указатель пытаетесь привести к самому объекту, это абсурд. А так не будет виртуализации. Чтобы заработала виртуализация, надо оператор вывода объявлять не для объекта, а для ссылки на объект. Тогда будет все нормально |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
http://liveworkspace.org/code/1484f5e5f033...07f6756f5231fcb
Добавлено через 44 секунды
|
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
||||
|
||||
gabin |
|
|||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
http://liveworkspace.org/code/b7a74e931da8...7089a4519e27ff3 Сделал по аналогии с вашим примером но теперь в методе класса не работает cout:
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Или, если вам нужна именно printData(), то так http://liveworkspace.org/code/6c8dfbc7604a...3d344af77d82951
А вообще идея называть методы именем cout - не очень хорошая идея. |
|||
|
||||
gabin |
|
|||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Спасибо. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
gabin |
|
|||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
В ходе дальнейшего расширения кода возникла проблема: реализовал шаблонный класс, который выполняет функции контейнера.
При добавлении в него POD объектов, контейнер работает без проблем - выводит через оператор << всё содержимое. Но при добавлении полиморфных объектов базового абстрактного класса он опять выводит адреса. Странно, ведь в main() они успешно выводятся(да и оператор << перегружен), а вот в контейнере не хотят... Вот код - http://liveworkspace.org/code/a4b8d24245e0...24d0091fa4b323f Подскажите пожалуйста как разрешить эту проблему |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
разыменовывайте указатель.. |
|||
|
||||
gabin |
|
|||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Успешно, но теперь не работает с POD объектами. Получается, что шаблонный класс не универсален? И нужно реализовывать 2 шаблонных класса - для статических и для динамических объектов? |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вы просто не умеете их готовить © ![]() чтоб заработал, можно например так (на скорую руку): http://liveworkspace.org/code/1d3aa15e9983...ce8579b462fa603 Это сообщение отредактировал(а) mes - 16.10.2011, 22:01 |
|||
|
||||
gabin |
|
|||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Гениально и просто ! |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а зачем тут ссылка на указатель то ? вы ж его не собираетесь переадресовывать.. |
||||
|
|||||
gabin |
|
|||
![]() студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |