1。)
之间有什么区别CArray <SomeClass> collection;
和
CArray <SomeClass,SomeClass> collection;
甚至
CArray <SomeClass* ,SomeClass* > collection;
2。)在阅读Stackoverflow上的一些评论时,我发现了一条说“不要使用CArray”的说明。为什么不使用CArray?
答案 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
具有更好,更通用的特性,尤其是在处理简单数据类型以外的对象时。
我的经验是使用CList
和CArray
指向对象。尽管你需要担心管理内存,但这样做似乎更容易预测。
查看afxtempl.h
中的来源的一个问题是,当CArray
通过内部函数SetSize()
变得更大时,memcpy_s()
函数用于复制{ {1}}从一个内存区域到另一个内存区域的元素。因此,您需要注意CArray
元素的指针和浅层复制。如果您使用过度重叠的内存区域做一些时髦的事情,则使用CArray
而不是memcpy_s()
,可能会出现问题。
这可能就是为什么我使用memmove_s()
作为指向对象指针的容器的经验似乎更好。
有趣的是,CArray
和Append()
方法看起来使用内部函数Copy()
,它通过元素赋值执行元素而不是CopyElements()
函数调用。但是,这些方法与memcpy_s()
个对象一起使用,而不与单个元素一起使用。
CArray
派生自CArray
,这意味着数据结构将包含CObject
的所有行李。然而,CObject
在MFC世界中也带来了一些好处,如序列化。
看起来您应该使用引用作为第二个模板参数,因此如果您使用的是类,则应使用CObject
。在我没有这样做之前,我遇到了问题,直到我从MFC Collections: The CArray Class发现了创建数组列表部分。
答案 2 :(得分:-2)
2)由于CArray在添加新元素时重新分配内存。