我在班上写了一个程序:
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;
}
但你的意思是添加“copy-constructor”?
http://msdn.microsoft.com/en-us/library/ccb3dh5c.aspx我找到了这个但是如何在我的代码中实现它。我无法改变CList课程。
答案 0 :(得分:1)
http://www.codeproject.com/Articles/13458/CMap-How-to
将复制构造函数和赋值运算符添加到类COrder
。这使得类可以复制。
[如果类在按键中使用,那么你需要在该类中使用HashKey()和CompareElemenst()]
另请注意STL containers are superior to MFC containers。
您收到错误,因为CMap具有默认copy-ctor,但CMap
和CList
派生自CObject
,CObject
声明私有复制构造函数和operator =。
因此,CMap
不提供“开箱即用”的复制语义。
我建议你使用STL std::map
容器,它设计在一个
实现复制语义的方法。
开箱即用的STL没有的只是序列化。
请注意,std::map
没有令人困惑的ARG_KEY
和ARG_VALUE
模板。
std::map
只有Key和Type模板参数(基本形式)。
http://msdn.microsoft.com/en-us/library/s44w4h2s%28VS.80%29.aspx
或者你可以按照Ajay所建议的方式使用指针方式来关闭编译器。
答案 1 :(得分:0)
问题陈述:
CList<CItem> m_oItem;
触发器声明(或一些用法):
CMap <CString, LPCTSTR, COrder, COrder> m_map;
为什么呢?好吧,CMap
会为COrder
调用复制构造函数和/或赋值运算符。您没有提供任何内容,但编译器会从您的类中提供它们(即COrder
)。此类包含CList
对象,该对象继承自CObject
。 CObject
未提供(或更好地说:阻止)复制构造函数或赋值运算符。
结果,编译器引发错误。不幸的是,(坏)编译器没有给你回溯这个错误。
作为解决方案的最佳选择:
CList < CItem* > m_oItem;
CList<CItem> *m_poItem;