代码之家  ›  专栏  ›  技术社区  ›  TalkingCode

简单的卡雷问题

  •  2
  • TalkingCode  · 技术社区  · 14 年前

    1)两者的区别是什么

    CArray <SomeClass> collection;
    

    CArray <SomeClass,SomeClass> collection;
    

    甚至

    CArray <SomeClass* ,SomeClass* > collection;
    

    ?

    2)当我读到一些关于stackoverflow的评论时,我看到一个便条,上面写着“不要使用carray”。为什么不应该使用carray?

    3 回复  |  直到 9 年前
        1
  •  7
  •   James McNellis    14 年前

    这是:

    CArray <SomeClass> collection;
    

    相当于:

    CArray <SomeClass, const SomeClass&> collection;
    

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

    这是:

    CArray <SomeClass* ,SomeClass* > collection;
    

    存储指向类型为的对象的指针的集合 SomeClass ,而另两个存储类型为 某个阶级

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

        2
  •  0
  •   Richard Chambers    9 年前

    不同之处在于 CArray 对象及其在对象中的存储方式, 动态数组 元素是指向某个类的对象的对象或指针。

    动态数组 似乎有一些意想不到的行为。它已经存在了很长一段时间,是为了适应mfc生态系统而设计的。C++标准模板库 vector 具有更好、更通用的特性,特别是在处理简单数据类型以外的对象时。

    我的经验是 CList 动态数组 带有指向对象的指针。这样做看起来更容易预测,尽管你确实需要担心管理内存。

    从中的源代码看一个问题 afxtempl.h 是不是当 动态数组 通过内部功能变得更大 SetSize() A memcpy_s() 函数用于复制 动态数组 从一个存储区域到另一个存储区域的元素。所以你需要小心指针和 动态数组 元素。从那以后 内存(S) 使用而不是 memmove_s() 如果你正在做一些有趣的事情与重叠的内存区域,可能有一个问题。

    这也许就是为什么我的经验 动态数组 作为指向对象的指针的容器似乎工作得更好。

    有趣的是它看起来像 Append() Copy() 方法使用内部函数 CopyElements() 它执行逐元素赋值,而不是 内存(S) 函数调用。但是,这些方法与 动态数组 对象,而不是单个元素。

    动态数组 是从 CObject 这意味着数据结构将拥有 老祖宗 . 但是也有一些好的事情 老祖宗 在mfc领域带来了序列化。

    看起来应该使用引用作为第二个模板参数,因此应该使用 CArray <SomeClass, SomeClass &> collection; 如果你在上课。当我没有做这个的时候我遇到了问题直到我发现了这个部分 创建数组列表 MFC Collections: The CArray Class

        3
  •  -2
  •   Ashish    14 年前

    2)因为carray在添加新元素时重新分配内存。