C++ C 风格将指针转换为指针

标签 c++ c pointers

这是我尝试代表我遇到的一个简单问题:

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/

相关文章:

c++ - 从ppm文件读取RGB值,并使用结构将其存储到称为 “Image”的2d数组中(动态数组)

c - 请解释此代码如何去除图像中的噪声

c++ - 从存储在 vector 中的指针获取对象属性

c++ - std::allocator<T>::deallocate 的第二个参数的目的是什么?

c++ - 找不到调试符号

c++ - munmap_chunk(): 使用 opencv cv::Ptr 时出现无效指针错误

c++ - 如何修复 “error: invalid use of non-static data member '树::root'” error in c++?

c - 如果声明了 int A[5],则只有 A 是指向 A[0] 的指针。这意味着 A 只是一个指针。那么 sizeof(A) 怎么会给出 20 的答案

c - 如何使以下双线性插值代码更高效?

c++ - 队列实现正在失去对头节点的跟踪