Запретить использование конструктора по умолчанию в производных классах, C++
есть ли способ создать базовый класс (например,boost:: noncopyable) и наследовать от него, что запретит компилятору генерировать конструктор по умолчанию для производных классов, если он не был сделан пользователем (разработчиком)?
пример:
class SuperDad {
XXX:
SuperDad(); // = delete?
};
class Child : YYY SuperDad {
public:
Child(int a) {...}
};
и результат:
int main () {
Child a; // compile error
Child b[7]; // compile error
Child c(13); // OK
}
3 ответов
#include <iostream>
using namespace std;
class InterfaceA
{
public:
InterfaceA(std::string message)
{
std::cout << "Message from InterfaceA: " << message << std::endl;
}
private:
InterfaceA() = delete;
};
class MyClass: InterfaceA
{
public:
MyClass(std::string msg) : InterfaceA(msg)
{
std::cout << "Message from MyClass: " << msg << std::endl;
}
};
int main()
{
MyClass c("Hello Stack Overflow");
return 0;
}
по данным это cppreference.com статья (что в основном является переводом c++ standard 12.1 от юриста к человеку. раздел):
если для класса не предусмотрены пользовательские конструкторы любого типа тип (struct, class или union), компилятор всегда будет объявлять конструктор по умолчанию как встроенный открытый член своего класса.
единственный способ управления неявно определенным конструктором Child
с SuperDad
делает компилятор, чтобы определить его как deleted
.
вы можете сделать это, сделав конструктор по умолчанию (или деструктор) из SuperDad
удалено, неоднозначно или недоступно - но тогда вам нужно определить другой способ создания базового класса и использовать его неявно из всех дочерних конструкторов.