在构造函数中强制转换void*并访问值



下面的代码无法编译,因为尽管在构造函数中进行了强制转换,但它找不到遵从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类型访问。

最新更新