Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 同样,但没有解决方案:错误C2248:';CObject::CObject';:无法访问类';CObject';_Visual Studio 2010_Visual C++ - Fatal编程技术网

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
不提供“开箱即用”的复制语义

我建议您使用STL
std::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;
}