这是我尝试代表我遇到的一个简单问题:
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()
。
是否可以在不了解 StaticObject
的情况下从 pointerToObject
获取有效的 test1
对象?
编辑 这就是我存储该指针的方式:
StaticObject** udata = (StaticObject**) lua_newuserdata(state, sizeof(StaticObject*));
*udata = object;
object
是指向StaticObject
的指针。我刚刚注意到 sizeof(StaticObject*)
这可能是我的问题的原因。方法的文档在这里:lua_newuserdata
。有没有办法在不修改 lua_newuserdata 方法的情况下实现我想要的目标?
最佳答案
可渲染对象的类型是什么?一般来说,如果将指针转换为void*
(不需要强制转换),则必须将其转换回其原始类型(需要强制转换)才能使用它。因此,如果 renderable
的类型是 StaticObject
,则 test1
的使用无效。
StaticObject renderable;
void *pointerToObject = &renderable;
Renderable* test1 = (Renderable*)pointerToObject; // invalid pointer
StaticObject *test2 = (StaticObject*)pointerToObject; // okay
关于C++ C 风格将指针转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19790498/