简单的CArray问题

时间:2010-05-05 13:33:54

标签: c++ windows mfc

1。)

之间有什么区别
CArray <SomeClass> collection;

CArray <SomeClass,SomeClass> collection;

甚至

CArray <SomeClass* ,SomeClass* > collection;

2。)在阅读Stackoverflow上的一些评论时,我发现了一条说“不要使用CArray”的说明。为什么不使用CArray?

3 个答案:

答案 0 :(得分:7)

此:

CArray <SomeClass> collection;

相当于:

CArray <SomeClass, const SomeClass&> collection;

第二个模板参数用于指定访问成员的类型。模板参数are described in the documentation on MSDN

此:

CArray <SomeClass* ,SomeClass* > collection;

存储指向SomeClass类型对象的指针集合,而其他两个存储类型为SomeClass的对象集合。

至于为什么你“不应该使用它”,std::vector,它是C ++语言标准的一部分,因此是可移植的,对于大多数项目来说可能是更好的选择。如果您的遗留代码使用CArray,那么您可能需要使用它,并且没有任何问题。

答案 1 :(得分:0)

不同之处在于CArray对象中存储的内容以及它在对象中的存储方式,CArray元素是对象还是指向某些类对象的指针。

CArray似乎有一些意想不到的行为。它已存在很长时间,旨在适应MFC生态系统。 C ++标准模板库vector具有更好,更通用的特性,尤其是在处理简单数据类型以外的对象时。

我的经验是使用CListCArray指向对象。尽管你需要担心管理内存,但这样做似乎更容易预测。

查看afxtempl.h中的来源的一个问题是,当CArray通过内部函数SetSize()变得更大时,memcpy_s()函数用于复制{ {1}}从一个内存区域到另一个内存区域的元素。因此,您需要注意CArray元素的指针和浅层复制。如果您使用过度重叠的内存区域做一些时髦的事情,则使用CArray而不是memcpy_s(),可能会出现问题。

这可能就是为什么我使用memmove_s()作为指向对象指针的容器的经验似乎更好。

有趣的是,CArrayAppend()方法看起来使用内部函数Copy(),它通过元素赋值执行元素而不是CopyElements()函数调用。但是,这些方法与memcpy_s()个对象一起使用,而不与单个元素一起使用。

CArray派生自CArray,这意味着数据结构将包含CObject的所有行李。然而,CObject在MFC世界中也带来了一些好处,如序列化。

看起来您应该使用引用作为第二个模板参数,因此如果您使用的是类,则应使用CObject。在我没有这样做之前,我遇到了问题,直到我从MFC Collections: The CArray Class发现了创建数组列表部分。

答案 2 :(得分:-2)

2)由于CArray在添加新元素时重新分配内存。