| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Перегрузка оператора вывода << |
| Автор: gabin 14.10.2011, 23:41 | ||||||||
| Здравствуйте. Хочу сделать перегрузку оператора вывода <<. Иерархия классов: (абстрактный)Component -> Engine -> GasEngine. Если я объявляю статический объект класса GasEngine, то вывод работает без проблем:
Но если я объявляю объект как указатель на абстрактный класс Component , то тут начинаются проблемы.
Результат:
Как сделать корректной перегрузку оператора вывода в данном случае? Исходный код проекта, сделанного в Eclipse, прикрепляю. |
| Автор: sQu1rr 14.10.2011, 23:57 | ||||
Если оператор << перегружен для класса Component, то
Добавлено через 1 минуту и 43 секунды Соответственно, если нет, то что-то типо
|
| Автор: gabin 15.10.2011, 00:26 | ||||||||||||
Оператор << перегружен для класса Engine и GasEngine. 1-й вариант не проходит, падает при выполнении:
2-й вариант с dynamic_cast при компиляции ошибка:
А вариант
Выводит что-то типа 0x9089008. |
| Автор: volatile 15.10.2011, 00:38 |
Не так работать вообще не будет. Вы здесь указатель пытаетесь привести к самому объекту, это абсурд. А так не будет виртуализации. Чтобы заработала виртуализация, надо оператор вывода объявлять не для объекта, а для ссылки на объект. Тогда будет все нормально |
| Автор: mes 15.10.2011, 00:38 | ||
| http://liveworkspace.org/code/1484f5e5f03347b2007f6756f5231fcb Добавлено через 44 секунды
|
| Автор: gabin 15.10.2011, 22:47 | ||||
http://liveworkspace.org/code/b7a74e931da8bdf337089a4519e27ff3 Сделал по аналогии с вашим примером но теперь в методе класса не работает cout:
|
| Автор: volatile 15.10.2011, 23:27 |
уберите лишнее, и все заработает http://liveworkspace.org/code/6b056ba78f64a09efdb34c799df835e3 |
| Автор: volatile 15.10.2011, 23:45 |
| Или, если вам нужна именно printData(), то так http://liveworkspace.org/code/6c8dfbc7604ad23c93d344af77d82951 А вообще идея называть методы именем cout - не очень хорошая идея. |
| Автор: gabin 15.10.2011, 23:59 | ||
Спасибо. |
| Автор: mes 16.10.2011, 10:17 | ||||
особенно для тех кто любит :
|
| Автор: gabin 16.10.2011, 19:54 |
| В ходе дальнейшего расширения кода возникла проблема: реализовал шаблонный класс, который выполняет функции контейнера. При добавлении в него POD объектов, контейнер работает без проблем - выводит через оператор << всё содержимое. Но при добавлении полиморфных объектов базового абстрактного класса он опять выводит адреса. Странно, ведь в main() они успешно выводятся(да и оператор << перегружен), а вот в контейнере не хотят... Вот код - http://liveworkspace.org/code/a4b8d24245e04091124d0091fa4b323f Подскажите пожалуйста как разрешить эту проблему |
| Автор: mes 16.10.2011, 20:00 |
разыменовывайте указатель.. |
| Автор: gabin 16.10.2011, 20:56 | ||
Успешно, но теперь http://liveworkspace.org/code/91380229bfdd37f906b5c97143bd8cdeс POD объектами. Получается, что шаблонный класс не универсален? И нужно реализовывать 2 шаблонных класса - для статических и для динамических объектов? |
| Автор: mes 16.10.2011, 22:00 |
Вы просто не умеете их готовить © чтоб заработал, можно например так (на скорую руку): http://liveworkspace.org/code/1d3aa15e998361e57ce8579b462fa603 |
| Автор: gabin 16.10.2011, 22:30 | ||
Гениально и просто ! |
| Автор: mes 16.10.2011, 23:25 | ||||
а зачем тут ссылка на указатель то ? вы ж его не собираетесь переадресовывать.. |
| Автор: gabin 17.10.2011, 09:54 | ||||
Спасибо. Поправил на
|