但是没有解决方案:错误C2248:'CObject :: CObject':无法访问类'CObject'中声明的私有成员

时间:2013-04-02 13:42:19

标签: visual-studio-2010 visual-c++

我在班上写了一个程序:

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课程。

2 个答案:

答案 0 :(得分:1)

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

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

[如果类在按键中使用,那么你需要在该类中使用HashKey()和CompareElemenst()]

另请注意STL containers are superior to MFC containers

您收到错误,因为CMap具有默认copy-ctor,但CMapCList派生自CObjectCObject声明私有复制构造函数和operator =。

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

我建议你使用STL std::map容器,它设计在一个 实现复制语义的方法。

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

请注意,std::map没有令人困惑的ARG_KEYARG_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对象,该对象继承自CObjectCObject未提供(或更好地说:阻止)复制构造函数或赋值运算符。

结果,编译器引发错误。不幸的是,(坏)编译器没有给你回溯这个错误。

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

  • CList < CItem* > m_oItem;
  • CList<CItem> *m_poItem;
  • 使用或实施您自己的收藏。