让我们假设我在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"中声明的私有成员。
我已经尝试过实现许多类型的重载和复制构造函数,但没有取得任何成功。我意识到还有其他解决这个错误的可能性,比如使用指针,但我确实在寻找一个完全符合我提供的代码的解决方案。有人知道怎么解决这个问题吗?
由于operator=(const CObject&)
在基类中被声明为私有,您必须在派生类中提供一个公共赋值运算符:
CProfession& operator=( const CProfession& other ) {
this->ID = other.ID;
this->name = other.name;
return *this;
}
根据您想要实现的语义,您可能需要根据您的需求调整实现。
还要记住三条规则,这是一条经验法则,声称如果一个类定义了以下其中一个,它可能应该定义所有三个:
- 析构函数
- 复制构造函数
- 复印作业操作员
以上所有内容都是由编译器隐式实现的,除非它们是由程序员声明的。三规则的基本原理是,如果编译器生成的成员函数中有一个不符合类的需要,必须由程序员定义,那么其他成员函数可能也不符合。