Как сделать конструктор по умолчанию приватным в базовом классе? - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу иметь класс, который делает другой класс синглтоном, когда мы наследуем его, поэтому я написал это:

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! Как я могу сделать конструктор по умолчанию частным в базовом классе?

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Как сделать конструктор по умолчанию приватным в базовом классе?

Вы можете использовать спецификатор доступа:

struct base {
private:  // this here
    base() = default;

Я получил эту ошибку:

 use of deleted function ‘some_base_class::some_base_class()’

Почему?

Поскольку вы попытались инициализировать производный класс по умолчанию.

И поскольку конструктор по умолчанию для базы является личным, то неявно сгенерированный Конструктор производных типов удаляется. Это потому, что нет способа построить базу из-за отсутствия доступа к конструктору.

0 голосов
/ 28 апреля 2020

похоже, что эта ошибка относится к параметризованному конструктору, который вы пометили как удалить ... используйте класс вместо структуры, если можете, потому что по умолчанию все члены являются закрытыми, если вы не указали их как публичные c или защищенные. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...