Здесь моя попытка представить простую проблему:
Renderable* test1 = *(Renderable**) pointerToObject;
StaticObject* test2 = *(StaticObject**) pointerToObject;
test1->setTransparency(0.5f); // Crash here.
test2->setTransparency(0.75f); // Works here.
Тип pointerToObject
равен void*
но внутри он фактически указывает на указатель на объект (например, Renderable**
). Renderable
- абстрактный класс, а StaticObject
- это дочерний класс, реализующий Renderable
. При компиляции программа вылетает из test1->set()
, но работает с test2->set()
.
Можно ли получить действительный объект test1
из pointerToObject
не зная о StaticObject
?
EDIT Вот как я храню этот указатель:
StaticObject** udata = (StaticObject**) lua_newuserdata(state, sizeof(StaticObject*));
*udata = object;
object
является указателем на StaticObject
. Я просто заметил sizeof(StaticObject*)
который, вероятно, является причиной моих проблем. Документация для methdod находится здесь: lua_newuserdata
. Есть ли способ достичь того, чего я хочу, без изменения метода lua_newuserdata
?
Каков тип renderable
объекта? В общем случае, если вы конвертируете указатель в void*
(для этого не требуется никакого броска), вы должны его вернуть обратно к исходному типу (который требует приведения) для его использования. Поэтому, если тип renderable
является StaticObject
, использование test1
недействительно.
StaticObject renderable;
void *pointerToObject = &renderable;
Renderable* test1 = (Renderable*)pointerToObject; // invalid pointer
StaticObject *test2 = (StaticObject*)pointerToObject; // okay
Renderable is an abstract class and StaticObject is a child class that implements Renderable.
renderable
(хотя, похоже, он исчез в недавнем редактировании). Могут быть вовлечены и другие типы, и когда вы выполняете преобразование указателя с помощью приведения, знание точных типов является критическим. Вы читали, что я сказал о преобразовании указателей?
setTransparency
вRenderable
или это просто виртуальная функция?