2011-07-14 47 views
3

我有一個返回一個無效數據的函數。我需要將它作爲結構來接收。 例如。說一個結構widget_data。函數GetObjectData()返回一個void數據。返回結構爲空

widget_data *wd=GetObjectData(); 

GetObjectData()返回sd->data

其中sd是結構,數據是void類型。

當我編譯它,我得到這樣

invalid conversion from void* to widget_data* 
+2

不是void數據,而是一個void指針。 –

回答

1

讓我們澄清事情有點第一。 void意味着什麼,所以你不能有一個void類型的數據。因此,如果函數返回void那麼就不可能返回任何數據。現在,void *是一個無效的指針。你可以把它當作指向某處的內存地址。它可能指向任何類型的數據,甚至無處可指。如果您確定您的函數返回指向widget_data對象的指針,則可以執行reinterpret_cast。例如:

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

如果您不確定,您必須檢查返回的數據類型。如果啓用了RTTI(這通常在默認情況下啓用),並且基類至少有一個虛擬方法,這可能是可能的。然後你可以使用dynamic_cast。如果這是不可能的,你必須想出一些檢查返回類型的自定義方式。

+0

你也可以使用static_cast從voidptr去,但除此之外,這個答案很好地解釋:) – nielsj

+0

@nj:是的,你可以!由於'reinterpret_cast'和'static_cast'在這裏都會做同樣的事情,所以我更喜歡'reinterpret_cast',因爲它讓更多的人知道誰讀取代碼時有強烈的假設,而不是非常強大的類型檢查,這表明可能非常髒黑客攻擊。但是,從技術上講,兩者都可以完成這項工作。 – 2011-07-14 16:36:27

6

static_cast錯誤信息可以轉換void*的指針特定類型:

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

這是有效的C,但不是有效的C++。您需要在C++中有明確的轉換,如

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

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

+1,因爲'reinterpret_cast'是一個更好的主意。在編碼方面,'void *'的轉換應該看起來很髒**,'reinterpret_cast'比'static_cast'更髒。 – iammilind