![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
volk666 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 1.6.2011 Репутация: нет Всего: нет |
class A {...}
class B : public A {...} std::tr1::shared_ptr< A > a(new B()); std::tr1::weak_ptr< B > b; b = a; // не компилируется Как можно сделать преобразование от предка к потомку для умных указателей? Нужно для списка классов, порожденных от A(возможно, абстрактного). Заранее спасибо. |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
|
|||
|
||||
cupper |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
а ты ничего не напутал ? преобразование вниз по иерархии это совсем плохая практика. Ты и просто на указателя такую штука так просто не сделаешь
тут нужно либо пользоваться хардкорными кастами (типа static_cast, или какой то другой). Либо хм... а других способов и не припомню я. |
||||||
|
|||||||
afiskon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Обычная практика, если не забывать делать деструкторы виртуальными.
ЗЫ. А еще в вашем коде память течет ;) Добавлено через 4 минуты и 47 секунд
А что, простите, "хардкорного" в static_cast? |
||||||
|
|||||||
cupper |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
http://alenacpp.blogspot.com/2005/08/c.html первый абзац абзац наиболее четко описывает то что я хотел сказать. Раскройте мне секрет как связано преобразования вниз по иерархии и виртуальные деструкторы ? |
||||
|
|||||
volk666 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 1.6.2011 Репутация: нет Всего: нет |
afiskon, большое спасибо
![]()
Это смотря что делаешь. Есть список объектов базового класса, обрабатывается алгоритмом. В то же время каждый элемент этого списка - свойство других объектов, но уже как производный класс. У каждого элемента есть ID, по которому он находится, и его тип заранее известен ==> никаких ошибок не будет. Это сообщение отредактировал(а) volk666 - 2.6.2011, 00:15 |
|||
|
||||
afiskon |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
cupper Это у вас такой хитрый троллинг?
![]()
Я так могу про что угодно написать:
или:
1. ПОЧЕМУ? 2. Даже если new в теории небезопасен (забыл сказать delete - и память потекла), это не значит, что его никогда-никогда не нужно использовать. Например, любая фабрика использует new. Не использовать теперь фабрики? Другой вопрос, что с умными указателями программа будет надежнее.
Пожалуйста:
Тут идет преобразование вниз (а вообще низ и верх иерархии - вещи относительные, родителей обычно рисуют сверху), но если у нас имеет место наслодование A -> B -> C, то мы можем создать C, вернуть его, как A, потом кастнуть в B и вызвать не тот деструктор ~B, когда нужен ~C. А вообще советую вам почитать Майерса, у него вопросы, что вы задаете, очень хорошо освещены. Это сообщение отредактировал(а) afiskon - 2.6.2011, 13:48 |
||||||||||
|
|||||||||||
cupper |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
А сами то читали :?
сейчас начнете, что есть ситуации когда нужно... и бла бла бла, тогда возвращайся к посту на блог Алены, и
Жаль нет Страуструпа в электронке под рукой, еще бы и на него сослался. Боюсь что бестолку. И кстати, указатели это зло, зловещее зло ![]() Это сообщение отредактировал(а) cupper - 2.6.2011, 21:54 |
||||||
|
|||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
полагаю, динамический полиморфизм Вам не известен. ![]() Добавлено через 2 минуты и 34 секунды вообще-то, afiskon истину глаголит. а работать с сырыми указателями, или со смартами - это не ошибка или нарушение правил - это выбор ![]() |
|||
|
||||
afiskon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
cupper, одно дело избегать (Майерс) и не использовать (Алёна C++ в вашей интерпретации). Я согласен с тем, что использование указателей по возможности нужно сводить к минимуму. Меньше шансов выстрелить себе в ногу. Но с
или
согласиться не могу. Если вы так не любите указатели, пишите на Haskell, там их вообще нет. Ни одного. В принципе. |
||||
|
|||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Я ей богу не понимаю почему вы плюшки ООП приписываете к кастам. Я бы мог щас расписать принципы ооп, накой хер нужны динамические полиморфизмы и виртуальные деструкторы... но вы и так должны это знать. Единственно чего я не понимаю - причем тут касты и все это. Каст это всего лишь преобразования типа но не стандартное (которое умеет делать сам компилятор, например от потомка к предку) а то ответственность за которое полностью и бесповоротно несет сам программист. А это лишний повод для ошибки.
Если в задаче появляется необходимость привести указатель предка к указателя на потомка для того что бы вызвать функции потомка, получается что у вас потомки совсем таки разные получаются. И смысл унаследовать их от родителя как бы и теряется. Так как они не дополняют а изменяют базовый класс. У Майерса про ето как раз очень хорошо написано, не помню в какой именно книже, толи советы по С++? толи по STL. PS. исправил ошибки. Это сообщение отредактировал(а) cupper - 3.6.2011, 13:45 |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Трудно в чем-то убедить человека, когда он этого не хочет
![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
пичалька ![]() Добавлено через 2 минуты и 10 секунд хотел было привести пример стандартной ситуации когда это нужно(возможно это единственный способ при динамическом полиморфизме), но не стану... как уже сказал afiskon: |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Пример в студию ! |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
http://liveworkspace.org/code/bf5e12a26406...b9cf0c8731596c8 покажи способ сделать это не используя каст по иерархии ;) на примере динамического полиморфизма. зы хотя я предпочитаю статический. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |