Производные от синглтона: один объект каждый из базы и производные?

0

У меня есть singleton class A с virtual protected destructor и private constructor. Я публично вывел его из него и создал класс B.

Могу ли я создать два объекта по одному для базового и производного классов?

Если я не могу, есть ли другой способ обмена одним и тем же кодом?

Когда я попытался, я получаю ошибки времени компиляции:

warning C4356: 'A::variable' : static data member cannot be initialized 
via derived class

B.cpp(4): error C2371: 'variable' : redefinition; different basic types
Теги:
inheritance

3 ответа

0

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

Конкретно, это означало бы сделать что-то вроде этого:

template<typename TDerived>
class Singleton {
public:
    static TDerived& instance() {
         static TDerived instance_;
         return instance_;
    }
protected:
    Singleton() {}
    virtual ~Singleton() {}
};

class ConcreteSingleton : public Singleton<ConcreteSingleton> {
public:
    ...
protected:
    ConcreteSingleton() {
         ...
    }
    virtual ~ConcreteSingleton() {
         ...
    }

};

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

В целом, как отмечалось в некоторых комментариях, singleton как шаблон имеет проблемы с масштабируемостью, хотя сонтовые синглтоны обычно считаются более безопасными.

0

Все зависит от того, как реализован ваш синглтон. Если у него есть какой-то публичный конструктор, то вы, вероятно, прекрасно с расширением его singleton-ness до производного экземпляра B Если это какой-то заводский метод, то, вероятно, нет. Тот факт, что он имеет protected dtor является признаком того, что он был создан для использования в качестве базового класса.

0

Не путайте с двумя независимыми идиомами:

  • Наследование является частью механики языка C++
  • Singleton - это политика создания экземпляров, определенная в вашем коде

Поэтому ответ на ваш вопрос: "Это зависит от того, как вы реализовали политику создания экземпляров".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню