我在入侵一个更大的项目时遇到了问题,所以我做了一个简单的测试用例。如果我没有遗漏任何东西,那么我的测试代码可以正常工作,但也许它偶然运行,所以我想向您展示一下,并询问这种方法是否存在任何缺陷。
我有一个OutObj,它具有一个成员变量(指针)InObj。 InObj具有成员函数。我将此成员变量对象(InObj)的地址作为void *发送给回调函数。这个对象的类型永远不会改变,因此在回调中我将其重铸为其原始类型并在其中调用aFunc成员函数。在本例中,它按预期方式工作,但在我正在研究的项目中,效果不理想。因此,我可能忽略了某些内容,或者这里有一个陷阱,这偶然发生了。任何意见?非常感谢。
(我的原始代码存在的问题是InObj.data是垃圾)。
#include <stdio.h>
class InObj
{
public:
int data;
InObj(int argData);
void aFunc()
{
printf("Inside aFunc! data is: %d\n", data);
};
};
InObj::InObj(int argData)
{
data = argData;
}
class OutObj
{
public:
InObj* objPtr;
OutObj(int data);
~OutObj();
};
OutObj::OutObj(int data)
{
objPtr = new InObj(data);
}
OutObj::~OutObj()
{
delete objPtr;
}
void callback(void* context)
{
((InObj*)context)->aFunc();
}
int main ()
{
OutObj a(42);
callback((void*)a.objPtr);
}
最佳答案
是的,这很安全。
指向任何类型的指针都可以转换为void指针,然后再返回。
请注意,到void*
的转换是隐式的,因此不需要强制转换。