0

Как удалить конструктор по умолчанию?

40

Вопрос: Как предотвратить неявное предоставление конструктора по умолчанию в C++ до версии 11?

Иногда мне не нужно предоставлять конструктор по умолчанию, и при этом я не хочу, чтобы компилятор создавал стандартный конструктор для моего класса. В C++11 я мог сделать следующее:

class MyClass 
{ 
  public: 
    MyClass() = delete; 
};

Однако мой преподаватель не позволяет использовать данную конструкцию в задании. Вопрос: существует ли способ в C++ до 11-й версии, чтобы запретить компилятору неявно предоставлять конструктор по умолчанию?

3 ответ(ов)

0

Конечно. Определите свой собственный конструктор, по умолчанию или другой.

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

0

Я бы предложил сделать конструктор приватным. Например, так:

class MyClass
{
private:
    MyClass();
};

Таким образом, никто (извне класса или из классов-друзей) не сможет вызвать конструктор по умолчанию. В результате у вас останется три варианта использования этого класса: либо предоставить конструктор с параметрами, либо использовать его как утилитарный класс (состоящий только из статических функций), либо создать фабрику для этого типа в дружественном классе.

0

С версии C++11 вы можете объявить конструктор с помощью = delete. Это полезно в сочетании с синтаксисом инициализации фигурными скобками {}.

Например:

struct foo {
  int a;

  foo() = delete; // Удаленный конструктор по умолчанию
  foo(int _a) {
    // Рабочий конструктор с аргументом
  }
};

foo f{};  // Ошибка: использование удаленной функции foo::foo()
foo f{3}; // ОК

Как видно из примера, попытка создать объект foo без аргументов ведет к ошибке, так как конструктор по умолчанию удален. Однако создание объекта с одним аргументом 3 происходит успешно, так как соответствующий конструктор доступен.

Вы можете узнать больше о удаленных неявно объявленных конструкторах на cppreference.com.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь