C ++ C стиль приведения указатель на указатель

0

Здесь моя попытка представить простую проблему:

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?

  • 0
    Может быть, setTransparency () не определен в Renderable (не имеет тела), а pointerToObject не является допустимым указателем на StaticObject?
  • 0
    Пожалуйста, предоставьте больше информации: реализован ли setTransparency в Renderable или это просто виртуальная функция?
Показать ещё 5 комментариев
Теги:
pointers

1 ответ

0

Каков тип renderable объекта? В общем случае, если вы конвертируете указатель в void* (для этого не требуется никакого броска), вы должны его вернуть обратно к исходному типу (который требует приведения) для его использования. Поэтому, если тип renderable является StaticObject, использование test1 недействительно.

StaticObject renderable;
void *pointerToObject = &renderable;
Renderable* test1 = (Renderable*)pointerToObject;     // invalid pointer
StaticObject *test2 = (StaticObject*)pointerToObject; // okay
  • 0
    ОП уже сказал, что Renderable is an abstract class and StaticObject is a child class that implements Renderable.
  • 0
    @starrify - он не сказал, какой тип объекта renderable (хотя, похоже, он исчез в недавнем редактировании). Могут быть вовлечены и другие типы, и когда вы выполняете преобразование указателя с помощью приведения, знание точных типов является критическим. Вы читали, что я сказал о преобразовании указателей?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню