C ++ C样式将指针转换为指针

Posted

技术标签:

【中文标题】C ++ C样式将指针转换为指针【英文标题】:C++ C style casting pointer to pointer 【发布时间】:2013-11-05 13:47:20 【问题描述】:

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

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方法的情况下实现我想要的吗?

【问题讨论】:

可能 setTransparency() 未在 Renderable 中定义(没有正文),并且 pointerToObject 不是指向 StaticObject 的有效指针? 请提供更多信息:setTransparency 是在Renderable 中实现的还是只是一个虚函数? 是的。它在头文件中实现如下: virtual void setTransparency(float value) transparent_ = value; Handwaving 不能替代编译和运行并显示问题的实际代码。 @SMGhost - 是的,情况总是如此。您的工作是将其简化为可以发布的易于管理的内容。几乎总是,这样做会引导您找到解决方案,而无需发布任何内容。 【参考方案1】:

renderable 对象的类型是什么?通常,如果您将指针转换为 void*(不需要强制转换),则必须将其转换回其原始类型(需要强制转换)才能使用它。所以如果renderable的类型是StaticObject,那么test1的使用是无效的。

StaticObject renderable;
void *pointerToObject = &renderable;
Renderable* test1 = (Renderable*)pointerToObject;     // invalid pointer
StaticObject *test2 = (StaticObject*)pointerToObject; // okay

【讨论】:

OP已经说过Renderable is an abstract class and StaticObject is a child class that implements Renderable. @starrify - 他没有说renderable 对象的类型是什么(尽管它似乎在最近的编辑中消失了)。可能还涉及其他类型,当您使用强制转换进行指针转换时,了解 exact 类型至关重要。您阅读我所说的关于指针转换的内容吗?

以上是关于C ++ C样式将指针转换为指针的主要内容,如果未能解决你的问题,请参考以下文章

为啥C ++允许将指向基对象的指针转换为派生类的指针[重复]

将 C 指针转换为 Python numpy 数组

Swig,将 c 指针转换为 float[]

如何合法地将函数指针转换为方法指针?

如何将指向c数组的指针转换为python数组

将函数指针的 C 结构体转换为 JNA 代码