使用CObject派生类作为CList的类型参数时出现错误C2248

时间:2013-08-14 20:58:36

标签: mfc operator-overloading clist

假设我在MFC项目中声明了以下类:

class CProfession : public CObject
{
public:
    CProfession();
    virtual ~CProfession();

    int ID;
    CString name;
};

class CPerson : public CObject
{
public:
    CPerson();
    virtual ~CPerson();

    int ID;
    CString name;
    int age;
    CString email;
    CList<CProfession, CProfession&> profession;
};

由于CList声明(如右上图所示),我收到以下错误: 错误C2248:'CObject :: operator =':无法访问类'CObject'中声明的私有成员。

我已经尝试过实现多种重载和复制构造函数,但我没有取得任何成功。我意识到还有其他可能性来解决这个错误,例如使用指针,但我真的在寻找一个完全符合我提供的代码的解决方案。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

由于operator=(const CObject&)在基类中被声明为私有,因此您必须在派生类中提供公共赋值运算符:

CProfession& operator=( const CProfession& other ) {
    this->ID = other.ID;
    this->name = other.name;
    return *this;
}

根据您要实现的语义,您可能需要根据您的要求调整实现。

还要记住Rule of three,这是一个经验法则,声称如果一个类定义了下面的一个,它应该定义所有三个:

  • 复制构造函数
  • copy assignment oprator

除非程序员声明它们,否则编译器将隐式实现上述所有操作。规则三的基本原理是,如果编译器生成的成员函数之一不适合类的需要并且必须由程序员定义,那么其他函数也可能不适合。