下面的代码无法编译,因为尽管在构造函数中进行了强制转换,但它找不到遵从void指针的方法。是否有办法让这段代码编译或关闭类型安全?
#include "stdafx.h"
#include <iostream>
using namespace std;
IntWrapper(int _value) : value{ nullptr }
{
value = new int(_value);
value = static_cast<int*>(value);
}
int main()
{
IntWrapper* foo = new IntWrapper(10);
cout << *foo->value;
cin.get();
return 0;
}
我应该注意到,虽然这段代码是一个控制台应用程序,但它是为了测试在虚幻引擎中编写的代码。由于这个原因,我不能使用类模板来实现所需的功能。
new int
返回一个和int*
。将int*
转换为int*
是不可行的,也没有任何效果。在将new
的结果强制转换为自身之后,将其存储在void*
变量中,该变量隐式地将其强制转换为void*
。
当您访问foo->value
时,类型是void*
,因为这是您为value
定义的类型。无论你在构造函数中做什么都不会改变这一点。如果你想强制转换void指针,这里就是你要做的。也就是说,您可以将foo->value
转换为int*
,然后对其解引用。
当然,如果value
一开始就变成int*
就容易多了。
首先,如果你使用"->",你是在对它左边的术语进行解引用。
在你的例子中*foo,但是因为foo是一个IntWrapper *,那么*foo也是一个IntWrapper。
所以语法是foo->value或(*foo).value.
另外,在另一个答案中所说的一切都是正确的,这个静态强制转换绝对不做任何事情。
因此,正确的代码应该是这样的:#include "stdafx.h"
#include <iostream>
using namespace std;
struct IntWrapper
{
IntWrapper(int _value) : value{ new int(_value) } {}
void * value;
};
int main()
{
IntWrapper * foo = new IntWrapper(10);
cout << *((int *)(foo->value));
cin.get();
return 0;
}
由于您正在制作int包装器,因此结构体内部的void *类型不是很有用。将其设置为int *将为您提供更好的错误处理,并且不需要强制转换foo->value来打印它或将其作为int类型访问。