Intereting Posts
Переопределение новой версии отладки без ущерба для размещения новых Как инициализировать std :: set compator? offsetof по classу стандартного макета? Как комитет по стандартам указывает статус рассматриваемого документа? Могу ли я читать файлы с диска с помощью Webassembly? C ++ 11 действительное системное время с миллисекундами Использование функции члена classа C ++ (не может быть статичной) в качестве функции обратного вызова C Невозможно создать вектор classа, содержащего ptr_vector Сортировка массива 2D-символов с помощью sort () в C ++ Разделение строки на несколько примитивных типов Передача C ++ с помощью динамического размера 2D-массива пропущено при поиске предварительно скомпилированного заголовка Как обрабатывать блоки в интерфейсе c ++ Ошибка связи: ссылка undef – функция друга Строгое правило слияния С ++ – Является ли освобождение от алиасинга «char» улицей с 2 ​​направлениями?

dynamic_cast void *

Мне нужно использовать динамический литой void *

void *target = (MYClass*)target;//I am storing initially(to implment delegate mechanism) .... delegateClass *delegate = dynamic_cast(target); 

Он дает ошибку не может преобразовать void *, я не могу использовать ниже код … так как это механизм делегата

 delegateClass *delegate = dynamic_cast(((MYClass*))target); 

Как получить тип цели и реализовать … Если я использую typeid (), я могу получить имя classа, но как использовать typeid в приведенном выше уравнении вместо target (((MYClass *)) target).

Вы не можете использовать динамическое перемещение, если только исходный тип переменной не имел vtable (т. Е. Имел виртуальные функции). Это связано с тем, что dynamic_cast требует информации типа времени выполнения, которая записывается в vtable; если vtable отсутствует, компилятор не знает, какой тип объекта.

Вы должны объявить базовый class с виртуальным деструктором и использовать указатели для этого базового classа, а не void * .

Если вы должны передать объект как void * тогда вы должны использовать

 delegateClass *delegate = static_cast(((MYClass*))target); 

поскольку между void *target и delegateClass нет отношения classов. Здесь вы говорите, что знаете эту цель _is_a_ delegateClass.

Однако эта идиома обычно используется для передачи кода через стандартные интерфейсы C и обратно.

Я вхожу в подобную ситуацию и изучаю стиль c ++ стиля. Я упомянул об этом llink http://www.cplusplus.com/doc/tutorial/typecasting/

Из этого я могу интерпретировать, что цель dynamic_cast состоит в том, чтобы гарантировать, что результат преобразования типа является допустимым полным объектом запрошенного classа. Поэтому, когда мы пытаемся преобразовать из производного classа в базовый class, преобразование является плавным. Но наоборот это неверно.

 class CBase { }; class CDerived: public CBase { }; CBase b; CBase* pb; CDerived d; CDerived* pd; pb = dynamic_cast(&d); // ok: derived-to-base pd = dynamic_cast(&b); // wrong: base-to-derived 

Теперь для этого базовый class должен быть полиморфным, т. Е. Должен иметь виртуальную функцию. Когда class является полиморфным, dynamic_cast выполняет специальную проверку во время выполнения, чтобы гарантировать, что выражение дает действительный полный объект запрошенного classа. Посмотрите здесь.

 class CBase { virtual void dummy() {} }; class CDerived: public CBase { int a; }; int main () { try { CBase * pba = new CDerived; CBase * pbb = new CBase; CDerived * pd; pd = dynamic_cast(pba); if (pd==0) cout << "Null pointer on first type-cast" << endl; pd = dynamic_cast(pbb); if (pd==0) cout << "Null pointer on second type-cast" << endl; } catch (exception& e) {cout << "Exception: " << e.what();} return 0; } 

Здесь код пытается выполнить два динамических трансляции из объектов-указателей типа CBase * (pba и pbb) в объект-указатель типа CDerived *, но только первый из них успешно выполнен. Несмотря на то, что оба являются указателями типа CBase *, pba указывает на объект типа CDerived, а pbb указывает на объект типа CBase. Таким образом, когда их соответствующие типы-отливки выполняются с помощью dynamic_cast, pba указывает на полный объект classа CDerived, тогда как pbb указывает на объект classа CBase, который является неполным объектом classа CDerived, поэтому он возвращает нулевой указатель на указывают на сбой.

Поэтому я предлагаю вам использовать static_cast, который предлагает двухстороннее литье типов, т. Е. От производного до базового classа, а также от производного до базового classа. Но в этом случае программисту необходимо убедиться, что преобразование безопасно, потому что проверка типа не выполняется во время выполнения, как в случае dynamic_cast.

В вашем коде здесь либо делается цель, чтобы указать, чтобы делить объект classа перед преобразованием (но убедитесь, что Myclass является полиморфным), иначе вы можете перейти на static_cast.

Это объяснение основано на моем недавнем чтении по этой теме, и я бы посоветовал вам обратиться к Effective C ++, чтобы получить более подробную информацию об этом. Я надеюсь, это поможет. 🙂