2010-05-05 200 views
2

1)什麼是簡單CARRAY問題

CArray <SomeClass> collection; 

CArray <SomeClass,SomeClass> collection; 

甚至

CArray <SomeClass* ,SomeClass* > collection; 

之間的區別?

2.)在閱讀Stackoverflow上的一些評論時,我來到一個註釋「不要使用CArray」。爲什麼要不要使用CArray?

回答

7

此:

CArray <SomeClass> collection; 

等效於此:

CArray <SomeClass, const SomeClass&> collection; 

第二個模板參數用於指定通過該部件被訪問的類型。模板參數are described in the documentation on MSDN

此:

CArray <SomeClass* ,SomeClass* > collection; 

商店指針SomeClass類型的對象的集合,而SomeClass類型的對象的其他兩個店集合。至於爲什麼你「不應該使用它」,作爲C++語言標準的一部分,因此便攜的std::vector對於大多數項目來說可能是更好的選擇。如果您的遺留代碼使用CArray,那麼您可能需要使用它,並且沒有任何問題。

-2

2)由於CArray在添加新元素時重新分配內存。

+3

和std :: vector? – Andrey 2010-05-05 13:44:58

+0

-1:這不是原因。矢量做同樣的事情 – 2010-05-05 14:30:44

0

不同之處在於存儲在CArray對象中的內容以及它如何存儲在對象中,無論CArray元素是對象還是指向某些類的對象的指針。

CArray似乎有一些意想不到的行爲。它已經存在了很長一段時間,並被設計爲適合MFC生態系統。 C++標準模板庫vector具有更好,更通用的特性,特別是在處理除簡單數據類型以外的對象時。

我的經驗是使用CListCArray以及指向對象的指針。這樣做,他們似乎更容易預測,但您確實需要擔心管理內存。從看着afxtempl.h

的一個問題是,當CArray通過內部功能SetSize(),製成大的memcpy_s()功能用於複製從一個存儲器區域CArray元件到另一個。所以你需要注意指針和CArray元素的淺拷貝。而且由於使用了memcpy_s()而不是memmove_s(),如果您在重疊內存區域做了一些奇怪的事情,可能會有問題。

這可能是我爲什麼用CArray作爲指向對象的容器的體驗好得多。

有趣的是它看起來像Append()Copy()方法使用的內部函數CopyElements()執行的元素賦值,而不是一個memcpy_s()函數調用的元素。但是,這些方法與CArray對象一起使用,而不是與單個元素一起使用。

CArrayCObject派生,這意味着數據結構將具有所有行李號CObject。然而,在MFC世界裏,像序列化一樣,還有一些好的東西。

它看起來像你應該使用一個引用作爲第二個模板參數,所以如果你正在使用一個類,你應該使用CArray <SomeClass, SomeClass &> collection;。當我沒有這樣做時,我遇到了問題,直到我發現MFC Collections: The CArray Class創建陣列列表