Запретить использование конструктора по умолчанию в производных классах, 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 ответов


сделать конструктор приватным.

protected:
    Base() = default;

#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 удалено, неоднозначно или недоступно - но тогда вам нужно определить другой способ создания базового класса и использовать его неявно из всех дочерних конструкторов.