Я хочу иметь класс, который делает другой класс синглтоном, когда мы наследуем его, поэтому я написал это:
template <typename Class,
typename T = std::enable_if<std::is_class_v<Class>>>
struct singleton
{
public:
static Class* get_instance(void)
{
if (!object)
{
object = new Class;
}
return object;
}
protected:
static Class* object;
singleton(void) = default;
private:
singleton(const singleton&) = delete;
singleton& operator=(const singleton&) = delete;
};
template <typename Class, typename T>
Class* singleton<Class, T>::object{nullptr};
И вот как я его использую:
struct some_base_class : public singleton<some_base_class>
{
private:
size_t m_variable;
public:
static auto make(const size_t var)
{
auto o{singleton<some_base_class>::get_instance()};
o->m_variable = var;
return o;
}
};
Но здесь some_base_class
не является Singleton, потому что в классе singleton
мы делаем конструктор по умолчанию защищенным членом, я пытался сделать его закрытым, но у меня появилась эта ошибка:
use of deleted function ‘some_base_class::some_base_class()’
Почему? я просто делаю его закрытым членом в базовом классе и отмечаю его = default
, а не = delete
! Как я могу сделать конструктор по умолчанию частным в базовом классе?