2013-08-27 86 views
-2

我有類A_class,我需要一個指向這個類的對象的指針向量。是否有充分的理由選擇其中一種用法:cpp有沒有理由更喜歡矢量<class_type*>到矢量<void*>?

vector<void*> my_vector; 
vector<A_class*> my_vector; 

真的有區別嗎?

編輯: 讓我改一下 - 是在存在方式的差異實際數組存儲?我不是在問安全問題,而是在於表現。

+0

你的意思是,除了讓編譯器完成其工作(類型檢查)? –

+1

'vector <*void>'沒有意義。你的意思是'矢量'? – aschepler

+0

除了使用類指針更快更安全的事實嗎?沒有,根本沒有 – user1233963

回答

1

你應該記住,一個空指針不能直接取消引用。你最終必須將它轉換爲你的班級。因此,如果沒有任何充足的理由去尋找一個void指針,並且你確定該vector必須存儲指向A_class對象的指針,那麼我寧願避免使用void指針。

+1

void指針的一個很好的原因正如你所描述的:你不想(可以)對它進行解引用。當你傳遞一些你最終傳回指針的'用戶數據'指針時,這很常見。你想把它當作一個不透明的標誌來對待。 –

+0

@FrerichRaabe:但是你也可以通過只向前聲明它引用的struct /類來做到這一點,避免有人錯誤地將一些隨機指針傳遞給你的函數。換句話說'class filehandle; filehandle * fileopen(const std :: string&filename); void close(filehandle *);' –

+1

@MatsPetersson:我正在考慮一個通過用戶數據指針的情況,你不知道它指向什麼,而你不想*知道它指向什麼。考慮線程創建函數的'void *'參數。你只是通過了一些指針,你應該稍後把它交給客戶端。 –

4

使用void *應儘可能避免。

這是出於兩個原因:

  1. 你失去對象的類型。
  2. 代碼變得更加混亂,因爲您必須將void *轉換回原始類型。

C++中很少有案例(感謝模板),其中void *實際上是有意義的。我確信有一些,但現在我不能真正想到任何情況(除了需要將其用於歷史/兼容性原因時,例如,將指向類的指針轉換爲「C」代碼,它在何處不理解class的概念,所以你不能給它正確的類型)。

2

你不能做了一大堆與void*除非你投了,所以真的沒有優勢,使用它在實際的類型。

即使唯一的原因是爲了避免不必要的演員陣容,這將是足夠的。這不是。您可能會將void*轉換爲任何內容並錯誤地使用結果。使用真實的類本身還具有代碼更清晰的額外好處。

2

是真的有區別嗎?

一個vector<void*>也將接受int*類型,YourClassHere**和任何其他指針,你可以想像的價值。這是不安全的,所以除非你有一個很好的理由來使用它(我想不出多少) - 不要。

爲什麼你甚至認爲它是一種替代方案?

它還需要您明確地將指針轉回A_class*,只要您使用它們(這很醜陋,冗長且容易出錯)。

0

您選擇

vector<*void> my_vector; 

,如果你不知道什麼類型的將被存儲在my_vector對象。如果你知道他們會A_class類型,然後使用

vector<A_class*> my_vector; 

using void pointers