Re[3]: Возможно ли по указателю типа void узнать на объект к
От: Кодт Россия  
Дата: 13.10.06 07:47
Оценка:
Здравствуйте, Phoenics, Вы писали:

A>>
A>>   A *a = dynamic_cast<A *>(ptr);
A>>


P>Компилятор VC7.0 грит error C2681: 'void *' : invalid expression type for dynamic_cast


Естественно.
Если ты уверен, что ptr — точно на A (и, возможно, на его потомков), то
A* pA = reinterpret_cast<A*>(pVoid); // первое допущение мы вынуждены сделать на свой страх и риск
AA* pAA = dynamic_cast<AA*>(pA); // в случае неудачи получим NULL


P>А можно ли просто привести тип к базовому? Типа A *a = (A*) pVoidPtr; Не будет ли перекосов при множественном наследовании или ещё в каких-нибудь ситуациях? Вызываемый метод не виртуальный. Наверное стоит сказать что метод который должен вызываться это перегруденный оператор delete, Ни у кого из классов потомков он не переопределяется.


Тогда, опять же в допущении, что это A*, просто
delete reinterpret_cast<A*>(pVoid);


Но может быть, тебе нужно косвенное удаление — подобно тому, как это делает shared_ptr, запоминающий функцию-убийцу вместе с переданным указателем?
typedef void(*deleter_func)(void*);

struct deleteable_ptr
{
    void* ptr;
    deleter_func del;
    // всякий обвес - конструкторы, операторы и т.п. - напиши сам по вкусу
};

////////////////////////////////

deleteable_ptr p;
p.ptr = new AA();
p.del = boost::checked_delete<AA>;

/////////////////////////////////

p.del(p.ptr);

Я надеюсь, что ты знаешь разницу между стейтментом delete (совершающим вызов деструктора, затем вызов оператора) и оператором delete (просто утилизирующим память).
Поэтому del запоминает именно checked_delete, являющуюся обёрткой стейтмента
template<class T> void checked_delete(void* p) { delete reinterpret_cast<T*>(p); }
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.