2010-05-05 111 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创建阵列列表