0

我和我的班级一起写了一个程序:

class COrder
{
public:
    COrder();
    ~COrder();


public:
        ...
    CList < CItem > m_oItem;
        ...
};

假设有我的其他类的列表 od 对象:

class CItem
{
public:
    CItem();
    ~CItem();

public:
    int m_i;
    double m_d;
    CString m_o;
};

并且编译器在标题中给了我这样的错误。任何想法为什么?在程序中,我在地图中使用 COrder:

CMap <CString, LPCTSTR, COrder, COrder> m_map

引用:

将复制构造函数和赋值运算符添加到您的类 COrder。

我将 operator= 添加到我的班级:

COrder& operator=( const COrder oNewOrder )
{
        ...
    m_oItem.AddTail( oNewOrder.m_oItem.GetTail() );
        ...
    return *this;
}

但是添加“复制构造函数”是什么意思?

http://msdn.microsoft.com/en-us/library/ccb3dh5c.aspx我发现了这个,但是如何在我的代码中实现它。我无法更改 CList 类。

4

2 回答 2

1

http://www.codeproject.com/Articles/13458/CMap-How-to

将复制构造函数和赋值运算符添加到您的类COrder。这使得类可复制。

[如果类用作 Key,那么您需要在该类中使用 HashKey() 和 CompareElemenst() ]

另请注意,STL 容器优于 MFC 容器

你会得到一个错误,因为 CMap 有默认的 copy-ctor,但是它派生自CMap并声明了私有复制构造函数和 operator=。CListCObjectCObject

因此,CMap不提供“开箱即用”的复制语义。

我建议您使用 STLstd::map容器,该容器旨在实现开箱即用的复制语义。

开箱即用的 STL 所没有的只是序列化。

注意std::map没有混淆ARG_KEYARG_VALUE 模板。 std::map仅具有 Key 和 Type 模板参数(以其基本形式)。

http://msdn.microsoft.com/en-us/library/s44w4h2s%28VS.80%29.aspx

否则,您可以按照 Ajay 的建议使用指针方式,您只需关闭编译器即可。

于 2013-04-03T12:38:29.233 回答
0

问题陈述:

CList<CItem> m_oItem;

以及触发语句(或某些用法):

CMap <CString, LPCTSTR, COrder, COrder> m_map;

为什么?好吧,CMap将调用复制构造函数和/或赋值运算符COrder。您没有提供任何内容,但编译器从您的类中提供了它们(即 for COrder)。此类包含一个CList对象,该对象继承自CObject. CObject不提供(或者更好地说:防止)复制构造函数或赋值运算符。

因此,编译器会引发错误。不幸的是,(坏的)编译器不会给你这个错误的回溯。

作为解决方案的最佳选择:

  • CList < CItem* > m_oItem;
  • CList<CItem> *m_poItem;
  • 使用或实现您自己的集合。
于 2013-04-02T17:36:19.700 回答