我在入侵一个更大的项目时遇到了问题,所以我做了一个简单的测试用例。如果我没有遗漏任何东西,那么我的测试代码可以正常工作,但也许它偶然运行,所以我想向您展示一下,并询问这种方法是否存在任何缺陷。

我有一个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*的转换是隐式的,因此不需要强制转换。

08-16 20:28