Ошибка 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;
}

В зависимости от семантики, которую вы хотите реализовать, вам, возможно, придется адаптировать реализацию к вашим требованиям.

Также имейте в виду Правило трех, практическое правило, утверждающее, что если класс определяет одно из следующего, он, вероятно, должен определить все три:

  • деструктор
  • конструктор копирования
  • копирование поручения

Все вышеперечисленное неявно реализуется компилятором, если они не объявлены программистом. Обоснование правила трех состоит в том, что если одна из функций-членов, сгенерированных компилятором, не соответствует потребностям класса и должна быть определена программистом, то другие, вероятно, также не подойдут.

Другие вопросы по тегам