我有類A_class
,我需要一個指向這個類的對象的指針向量。是否有充分的理由選擇其中一種用法:cpp有沒有理由更喜歡矢量<class_type*>到矢量<void*>?
vector<void*> my_vector;
vector<A_class*> my_vector;
真的有區別嗎?
編輯: 讓我改一下 - 是在存在方式的差異實際數組存儲?我不是在問安全問題,而是在於表現。
我有類A_class
,我需要一個指向這個類的對象的指針向量。是否有充分的理由選擇其中一種用法:cpp有沒有理由更喜歡矢量<class_type*>到矢量<void*>?
vector<void*> my_vector;
vector<A_class*> my_vector;
真的有區別嗎?
編輯: 讓我改一下 - 是在存在方式的差異實際數組存儲?我不是在問安全問題,而是在於表現。
你應該記住,一個空指針不能直接取消引用。你最終必須將它轉換爲你的班級。因此,如果沒有任何充足的理由去尋找一個void指針,並且你確定該vector必須存儲指向A_class對象的指針,那麼我寧願避免使用void指針。
void指針的一個很好的原因正如你所描述的:你不想(可以)對它進行解引用。當你傳遞一些你最終傳回指針的'用戶數據'指針時,這很常見。你想把它當作一個不透明的標誌來對待。 –
@FrerichRaabe:但是你也可以通過只向前聲明它引用的struct /類來做到這一點,避免有人錯誤地將一些隨機指針傳遞給你的函數。換句話說'class filehandle; filehandle * fileopen(const std :: string&filename); void close(filehandle *);' –
@MatsPetersson:我正在考慮一個通過用戶數據指針的情況,你不知道它指向什麼,而你不想*知道它指向什麼。考慮線程創建函數的'void *'參數。你只是通過了一些指針,你應該稍後把它交給客戶端。 –
使用void *
應儘可能避免。
這是出於兩個原因:
void *
轉換回原始類型。C++中很少有案例(感謝模板),其中void *
實際上是有意義的。我確信有一些,但現在我不能真正想到任何情況(除了需要將其用於歷史/兼容性原因時,例如,將指向類的指針轉換爲「C」代碼,它在何處不理解class
的概念,所以你不能給它正確的類型)。
你不能做了一大堆與void*
除非你投了,所以真的沒有優勢,使用它在實際的類型。
即使唯一的原因是爲了避免不必要的演員陣容,這將是足夠的。這不是。您可能會將void*
轉換爲任何內容並錯誤地使用結果。使用真實的類本身還具有代碼更清晰的額外好處。
是真的有區別嗎?
一個vector<void*>
也將接受int*
類型,YourClassHere**
和任何其他指針,你可以想像的價值。這是不安全的,所以除非你有一個很好的理由來使用它(我想不出多少) - 不要。
爲什麼你甚至認爲它是一種替代方案?
它還需要您明確地將指針轉回A_class*
,只要您使用它們(這很醜陋,冗長且容易出錯)。
您選擇
vector<*void> my_vector;
,如果你不知道什麼類型的將被存儲在my_vector
對象。如果你知道他們會A_class
類型,然後使用
vector<A_class*> my_vector;
你的意思是,除了讓編譯器完成其工作(類型檢查)? –
'vector <*void>'沒有意義。你的意思是'矢量'? –
aschepler
除了使用類指針更快更安全的事實嗎?沒有,根本沒有 – user1233963