2

假设我在 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 =' : cannot access private member declaration in class 'CObject'

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

4

1 回答 1

2

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

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

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

还要记住的规则,一个经验法则声称如果一个类定义了以下之一,它可能应该定义所有三个:

  • 析构函数
  • 复制构造函数
  • 复制分配操作员

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

于 2013-08-14T22:42:38.110 回答