Скрытие конструкторов копирования для абстрактного базового класса

0

У меня есть абстрактный базовый класс, который имеет некоторые виртуальные методы и виртуальный деструктор. Я хочу, чтобы конструктор копирования и оператор присваивания базового класса (и производного класса) были закрытыми, поэтому я могу скрыть их, а инструмент статического анализа (klockwork) не может его отмечать. Это мой фрагмент кода:

class Parent: public mainParentClassIDontCareAbout
{
 public:
         Parent (int a);
         virtual ~Parent ();
 protected:
         void doSomething(); 
      .
      .
 private:
          // Hide assignment operator and copy constructor
         Parent (const Parent&) {};
         Parent operator= (const Parent&) {return *this;};

 } // end of parent class definition

class Child : public Parent
{
 public:
         Child (void *x, int y, bool z);
         ~Child ();
 protected:
           .
           .
           .
 private:
          // Hide assignment operator and copy constructor
         Child (const Child&) {};
         Child operator= (const Child&) {return *this;};

 } // end of parent class definition

Однако, я получаю ошибку времени компиляции как:

invalid abstract return type for member function ‘Lib::Parent Lib::Parent::operator=(const Lib::Parent&)

Я хочу скрыть оператор присваивания и конструктор копирования. Это не допустимое поведение, когда у нас есть виртуальный деструктор или есть ли какие-либо решения, если я хочу иметь один и тот же сценарий?

Теги:
polymorphism
inheritance
copy-constructor
static-analysis

1 ответ

2
Лучший ответ

Оператор присваивания должен возвращать ссылку:

Parent & operator= (const Parent&) {return *this;}
       ^

а также для Child. Кроме того, они ничего не могут вернуть, если вам не нужны цепочки присвоений.

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

  • 0
    Должно ли это быть верно и для конструктора копирования? Parent & (cosnt Parent &) {}; ?
  • 0
    @noobcoder: Нет, конструкторы ничего не возвращают. Они объявлены так, как будто имеют то же имя, что и класс, который они создают.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню