2010-08-15 3 views
1

У меня есть четыре класса, давайте назовем S1, S2, S3 и S4. Эти классы являются одноточечными; каждый из них имеет метод getInstance и finalize - и частную переменную экземпляра.Создание класса SingletonMixin в C++

Теперь, чтобы избежать repeting финализации и методы GetInstance Я пытаюсь сделать класс SingletonMixin, что-то вроде:

template<class T> class SingletonMixin 
{ 
    public: 
     static T* getInstance(); 
    private: 
     static T* instance; 

}; 

Проблема состоит в следующем: как может экземпляр одноточечное clasess и держать их конструктор частных ?


Редактировать

(осветление)

Я имею в виду, как я могу это сделать:

template<class T> T* SingletonMixin<T>::instance = 0; 
template<class T> T* SingletonMixin<T>::getInstance() 
{ 
    if (instance == 0) 
    { 
     instance = T(); 
    } 
    return instance; 
}; 

но с частной T конструкцией T()


Благодаря!

+2

Простой ответ: не надо. Синглтоны - это ужасный дизайн, который следует избегать, когда это возможно. – Puppy

+0

Четыре одноэлементных класса? Большинство людей не в состоянии думать о * одном правильном использовании синглетонов. – jalf

+0

@jalf: это просто упражнение, я изучаю язык. – Hugo

ответ

1

Проблема: Если вы делаете конструкторы private (private), базовый класс Singleton не может создать экземпляр.

Однако:

friend class SingletonMixin<Foo>; 

является вашим другом.

+1

Нет деконструкторов, только деструкторов. –

0

Не работает ли следующее?

class Foo : public SingletonMixin<Foo> 
{ 
}; 
+0

Это не работает, базовый класс не может вызвать конструктор/деструктор производного класса, если он защищен/закрыт. Вы объявляете базовый класс как «друга», чтобы иметь возможность сделать это. – Praetorian

0

Синглтоны и наследование смешиваются очень плохо. Это связано с тем, что фундаментальное утверждение об Singleton заключается в следующем: «может быть только один экземпляр этого класса», тогда как существование дочерних классов подразумевает, что существует, по крайней мере, возможность разных случаев. Вы должны почти наверняка реорганизовать это, чтобы эти четыре класса не были одиночными.

Смежные вопросы