将结构体作为void返回

3

我有一个返回空数据的函数,但是我需要将其作为结构体接收。 例如:一个名为widget_data的结构体,一个名为GetObjectData()的函数返回空数据。

widget_data *wd=GetObjectData();

GetObjectData()返回sd->data

其中sd是一个结构体,数据类型为void

当我编译它时,会出现错误信息。

invalid conversion from void* to widget_data*

2
不是空数据,而是空指针。 - Blagovest Buyukliev
4个回答

6

static_cast可以将void*转换为指向特定类型的指针:

widget_data* wd = static_cast<widget_data*>( yourVoidPointer );

3
widget_data *wd=(widget_data *)GetObjectData();

或者

widget_data *wd=reinterpret_cast<widget_data *>(GetObjectData());

2
+1,因为reinterpret_cast是更好的选择。从编码角度来看,将void*转换可能看起来很不干净,而reinterpret_caststatic_cast更不干净。 - iammilind

1

这是合法的C语言,但不是合法的C++语言。你需要在C++中进行显式转换,例如

widget_data *wd = static_cast<widget_data *>(GetObjectData());

1

让我们先澄清一些事情。 void 表示什么也没有,因此您不能拥有 void 类型的数据。因此,如果函数返回 void,则无法返回任何数据。现在,void * 是一个空指针。您可以将其视为指向某个地方的内存地址。它可以指向任何类型的数据,甚至可能是不存在的。如果您非常确定您的函数返回指向 widget_data 对象的指针,则可以进行 reinterpret_cast。例如:

widget_data *wd = reinterpret_cast<widget_data *> (GetObjectData ());

如果你不太确定,你必须检查返回的数据类型。如果启用了RTTI(通常默认启用),并且基类至少有一个虚方法,则可能会实现此操作。然后可以使用dynamic_cast。如果无法实现此操作,则必须想出一些自定义的方法来检查返回类型。


你可以像使用 static_cast 那样从 void 指针进行转换,但除此之外,这个答案解释得非常好 :) - nielsj
@nj:是的,你可以!由于在这里reinterpret_caststatic_cast都会做同样的事情,我更喜欢使用reinterpret_cast,因为它能够让阅读代码的人更清楚地了解到存在一个强烈的假设和不太强的类型检查,这表明可能存在非常肮脏的黑科技。但是,从技术上讲,两者都能完成工作。 - user405725

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接