Как привести класс в такой иерархии?
От: Varavva  
Дата: 03.03.16 09:25
Оценка:
Что-то с этим Obj-C подзабыл немного C++

Есть такая иерархия классов



Есть функция, возвращающая указатель на С, но на самом деле она возвращает указатель на объект D

Можно ли как-то правильно этот указатель на С превратить в правильный указатель на А?
Re: Как привести класс в такой иерархии?
От: T4r4sB Россия  
Дата: 03.03.16 09:32
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Что-то с этим Obj-C подзабыл немного C++


V>Есть такая иерархия классов


V>Image: aas.png


V>Есть функция, возвращающая указатель на С, но на самом деле она возвращает указатель на объект D


V>Можно ли как-то правильно этот указатель на С превратить в правильный указатель на А?


static_cast<A*>(dynamic_cast<D*>(cptr))
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: Как привести класс в такой иерархии?
От: Varavva  
Дата: 03.03.16 09:34
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>static_cast<A*>(dynamic_cast<D*>(cptr))


Эмм, забыл сказать, что это все в библиотеке и класс D внутри библиотеки, а A B и C — торчат наружу. То есть пользователь библиотеки не знает про D
Re[3]: Как привести класс в такой иерархии?
От: Varavva  
Дата: 03.03.16 09:37
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Здравствуйте, T4r4sB, Вы писали:


TB>>static_cast<A*>(dynamic_cast<D*>(cptr))


V>Эмм, забыл сказать, что это все в библиотеке и класс D внутри библиотеки, а A B и C — торчат наружу. То есть пользователь библиотеки не знает про D


А, придумал сам уже. К классу С добавить метод getA() — нормальное решение?
Re[3]: Как привести класс в такой иерархии?
От: T4r4sB Россия  
Дата: 03.03.16 09:41
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Здравствуйте, T4r4sB, Вы писали:


TB>>static_cast<A*>(dynamic_cast<D*>(cptr))


V>Эмм, забыл сказать, что это все в библиотеке и класс D внутри библиотеки, а A B и C — торчат наружу. То есть пользователь библиотеки не знает про D


Дописать функцию в библиотеку можно?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[4]: Как привести класс в такой иерархии?
От: B0FEE664  
Дата: 03.03.16 09:52
Оценка:
Здравствуйте, Varavva, Вы писали:

TB>>>static_cast<A*>(dynamic_cast<D*>(cptr))

V>>Эмм, забыл сказать, что это все в библиотеке и класс D внутри библиотеки, а A B и C — торчат наружу. То есть пользователь библиотеки не знает про D
V>А, придумал сам уже. К классу С добавить метод getA() — нормальное решение?

Если getA() — виртуальной, то на мой вкус это нормальное решение.
И каждый день — без права на ошибку...
Re[5]: Как привести класс в такой иерархии?
От: Varavva  
Дата: 03.03.16 09:54
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Если getA() — виртуальной, то на мой вкус это нормальное решение.


C — вообще весь виртуальный, это интерфейс
Re: Как привести класс в такой иерархии?
От: monah_tuk Пират http://htrd.su
Дата: 03.03.16 11:27
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Что-то с этим Obj-C подзабыл немного C++


V>Есть такая иерархия классов


V>Image: aas.png


V>Есть функция, возвращающая указатель на С, но на самом деле она возвращает указатель на объект D


V>Можно ли как-то правильно этот указатель на С превратить в правильный указатель на А?


dynamic_cast C из А и проверка на nullptr? Или какие-то проблемы есть. Простой пример, говорит, что нет:
http://ideone.com/o8uNlj — первый вариант: есть общий класс в иерархии — привести получилось. Второй — нет общего класса — получили nullptr
Re[2]: Как привести класс в такой иерархии?
От: Varavva  
Дата: 03.03.16 11:29
Оценка:
Здравствуйте, monah_tuk, Вы писали:

_>dynamic_cast C из А и проверка на nullptr? Или какие-то проблемы есть. Простой пример, говорит, что нет:

_>http://ideone.com/o8uNlj — первый вариант: есть общий класс в иерархии — привести получилось. Второй — нет общего класса — получили nullptr

Не знай почему проблемы были, но XCode после приведения вообще выдал левый указатель и все падало. Но все уже решилось, так что тему можно закрывать
Re: Как привести класс в такой иерархии?
От: Videoman Россия https://hts.tv/
Дата: 03.03.16 13:46
Оценка: +1
Здравствуйте, Varavva, Вы писали:

V>Можно ли как-то правильно этот указатель на С превратить в правильный указатель на А?


Обыкновенный dynamic_cast это умеет. Ключевое словосочетание: cross cast.
Re[2]: Как привести класс в такой иерархии?
От: ML380 Земля  
Дата: 05.03.16 08:21
Оценка: +1
Здравствуйте, monah_tuk, Вы писали:

_>dynamic_cast C из А и проверка на nullptr? Или какие-то проблемы есть. Простой пример, говорит, что нет:


Если есть 100% увереноость в том, что

на самом деле она возвращает указатель на объект D


то никакой dynamic_cast не нужен.

Достаточно двух static_cast.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.