我有一個返回一個無效數據的函數。我需要將它作爲結構來接收。 例如。說一個結構widget_data。函數GetObjectData()返回一個void數據。返回結構爲空
widget_data *wd=GetObjectData();
和GetObjectData()
返回sd->data
。
其中sd
是結構,數據是void
類型。
當我編譯它,我得到這樣
invalid conversion from void* to widget_data*
我有一個返回一個無效數據的函數。我需要將它作爲結構來接收。 例如。說一個結構widget_data。函數GetObjectData()返回一個void數據。返回結構爲空
widget_data *wd=GetObjectData();
和GetObjectData()
返回sd->data
。
其中sd
是結構,數據是void
類型。
當我編譯它,我得到這樣
invalid conversion from void* to widget_data*
讓我們澄清事情有點第一。 void
意味着什麼,所以你不能有一個void類型的數據。因此,如果函數返回void
那麼就不可能返回任何數據。現在,void *
是一個無效的指針。你可以把它當作指向某處的內存地址。它可能指向任何類型的數據,甚至無處可指。如果您確定您的函數返回指向widget_data
對象的指針,則可以執行reinterpret_cast。例如:
widget_data *wd = reinterpret_cast<widget_data *> (GetObjectData());
如果您不確定,您必須檢查返回的數據類型。如果啓用了RTTI(這通常在默認情況下啓用),並且基類至少有一個虛擬方法,這可能是可能的。然後你可以使用dynamic_cast。如果這是不可能的,你必須想出一些檢查返回類型的自定義方式。
你也可以使用static_cast從voidptr去,但除此之外,這個答案很好地解釋:) – nielsj
@nj:是的,你可以!由於'reinterpret_cast'和'static_cast'在這裏都會做同樣的事情,所以我更喜歡'reinterpret_cast',因爲它讓更多的人知道誰讀取代碼時有強烈的假設,而不是非常強大的類型檢查,這表明可能非常髒黑客攻擊。但是,從技術上講,兩者都可以完成這項工作。 – 2011-07-14 16:36:27
static_cast
錯誤信息可以轉換void*
的指針特定類型:
widget_data* wd = static_cast<widget_data*>(yourVoidPointer);
這是有效的C,但不是有效的C++。您需要在C++中有明確的轉換,如
widget_data *wd = static_cast<widget_data *>(GetObjectData());
widget_data *wd=(widget_data *)GetObjectData();
或
widget_data *wd=reinterpret_cast<widget_data *>(GetObjectData());
+1,因爲'reinterpret_cast'是一個更好的主意。在編碼方面,'void *'的轉換應該看起來很髒**,'reinterpret_cast'比'static_cast'更髒。 – iammilind
不是void數據,而是一個void指針。 –