【问题标题】:Again but without solution: error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'再次但没有解决方案:错误 C2248:“CObject::CObject”:无法访问在类“CObject”中声明的私有成员
【发布时间】:2013-04-04 02:34:41
【问题描述】:

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

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 类。

【问题讨论】:

  • 你应该重新考虑你的信息隐藏,因为你没有......
  • 现在不是我的首要任务,而是ty。

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


【解决方案1】:

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

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

[如果类被用作 Key,那么你需要在该类中使用 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 建议的指针方式去关闭编译器。

【讨论】:

  • 非常好,你能回答我上面的问题吗?
  • 是的,您不能更改 CList 类。但至少你可以派生一个并从 CList 派生你自己的类,然后你可以通过将那些复制构造函数和赋值重载添加到你的类来使用这个技巧。
  • 好吧,我后来也是这么想的。所以在我的复制构造函数中,我应该将列表中的所有元素复制到我复制的列表中(循环)?
  • 是的,您必须添加代码以通过迭代源列表来复制列表。
【解决方案2】:

问题陈述:

CList&lt;CItem&gt; m_oItem;

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

CMap &lt;CString, LPCTSTR, COrder, COrder&gt; m_map;

为什么?好吧,CMap 会为COrder 调用复制构造函数和/或赋值运算符。你没有提供任何东西,但是编译器从你的类中提供了它们(即COrder)。该类包含一个CList 对象,该对象继承自CObjectCObject 不提供(或者更好地说:Prevents)复制构造函数或赋值运算符。

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

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

  • CList &lt; CItem* &gt; m_oItem;
  • CList&lt;CItem&gt; *m_poItem;
  • 使用或实现您自己的集合。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2015-05-05
    • 1970-01-01
    • 2013-07-28
    • 2013-04-24
    • 2014-08-07
    • 2015-09-05
    • 2021-05-13
    相关资源
    最近更新 更多