Ошибка C2248 при использовании производного от CObject класса в качестве параметра типа 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 ответ
Поскольку operator=(const CObject&)
объявлен как private в базовом классе, вы должны предоставить открытый оператор присваивания в вашем производном классе:
CProfession& operator=( const CProfession& other ) {
this->ID = other.ID;
this->name = other.name;
return *this;
}
В зависимости от семантики, которую вы хотите реализовать, вам, возможно, придется адаптировать реализацию к вашим требованиям.
Также имейте в виду Правило трех, практическое правило, утверждающее, что если класс определяет одно из следующего, он, вероятно, должен определить все три:
- деструктор
- конструктор копирования
- копирование поручения
Все вышеперечисленное неявно реализуется компилятором, если они не объявлены программистом. Обоснование правила трех состоит в том, что если одна из функций-членов, сгенерированных компилятором, не соответствует потребностям класса и должна быть определена программистом, то другие, вероятно, также не подойдут.