Visual studio 2010 同样,但没有解决方案:错误C2248:';CObject::CObject';:无法访问类';CObject';
我用我的班级写了一个程序:Visual studio 2010 同样,但没有解决方案:错误C2248:';CObject::CObject';:无法访问类';CObject';,visual-studio-2010,visual-c++,Visual Studio 2010,Visual C++,我用我的班级写了一个程序: class COrder { public: COrder(); ~COrder(); public: ... CList < CItem > m_oItem; ... }; COrder& operator=( const COrder oNewOrder ) { ... m_oItem.AddTail( oNewOrder.m_oItem.GetTail()
class COrder
{
public:
COrder();
~COrder();
public:
...
CList < CItem > m_oItem;
...
};
COrder& operator=( const COrder oNewOrder )
{
...
m_oItem.AddTail( oNewOrder.m_oItem.GetTail() );
...
return *this;
}
编译器在标题中给我这样的错误。你知道为什么吗?
在程序中,我在地图中使用了COrder:
CMap <CString, LPCTSTR, COrder, COrder> m_map
但是你添加“复制构造函数”是什么意思呢
我发现了这一点,但如何在我的代码中实现它。我无法更改CList类。问题声明:
CList m_oItem代码>
和触发器语句(或某些用法):
CMap-m\u图代码>
为什么??那么,CMap
将调用COrder
的复制构造函数和/或赋值运算符。您没有提供任何,但编译器从类中提供了它们(例如,对于COrder
)。此类包含一个CList
对象,该对象继承自CObject
CObject
不提供复制构造函数或赋值运算符(或者更好地说:阻止)
因此,编译器会引发错误。不幸的是,(坏的)编译器没有返回此错误的跟踪
作为解决方案的最佳选择:
CListm_oItem代码>
CList*m_poItem代码>
- 使用或实现您自己的集合
将复制构造函数和赋值运算符添加到类COrder
。这使得类可以复制
[如果类在中用作键,则需要该类中的HashKey()和CompareElemenst()]
还要注意的是
出现错误是因为CMap具有默认的复制构造函数,但CMap
和CList
是从CObject
派生的,而CObject
声明了私有复制构造函数和运算符=
因此,CMap
不提供“开箱即用”的复制语义
我建议您使用STLstd::map
container,它是在
实现即时复制语义的方法
STL开箱即用所没有的只是序列化
请注意,std::map
没有混淆的ARG_键
和ARG_值
模板。
std::map
只有键和类型模板参数(以其基本形式)
或者,你可以按照Ajay建议的指针方式,关闭编译器。你应该重新考虑你的信息隐藏,因为你没有信息隐藏……这不是我现在的优先事项,但是ty.ty非常重要,你能回答我上面的问题吗?是的,你不能更改CList类。但至少你可以派生一个类,让你自己的类从CList派生,然后你可以使用这个技巧,把复制构造函数和赋值重载添加到你的类中。因此,在复制构造函数中,我应该将列表的所有元素复制到复制的列表中(在循环中)?是的,您必须添加代码,通过迭代源列表来复制列表。
COrder& operator=( const COrder oNewOrder )
{
...
m_oItem.AddTail( oNewOrder.m_oItem.GetTail() );
...
return *this;
}