2010-08-15 75 views
1

我有四个类,让我们调用S1,S2,S3和S4。这些课是单身人士;每个人都有一个getInstance和一个finalize方法 - 以及一个实例私有变量。在C++中创建一个SingletonMixin类

现在,为了避免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()


谢谢!

+2

简单的答案是:不要。尽可能避免单身人士是可怕的设计模式。 – Puppy 2010-08-15 15:07:42

+0

四个单身课程?大多数人无法想到* one *适当使用单身人士。 – jalf 2010-08-15 20:22:33

+0

@jalf:只是一个练习,我正在学习这门语言。 – Hugo 2010-08-16 23:52:26

回答

1

问题:如果您使(de)构造函数为私有,则Singleton基类无法生成实例。

但是:

friend class SingletonMixin<Foo>; 

是你的朋友。

+1

没有解构器,只有析构器。 – 2010-08-15 16:03:18

0

以下不行吗?

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

它不起作用,如果它们是受保护的/私有的,基类不能调用派生类的构造函数/析构函数。你已经声明基类是一个“朋友”,可以做到这一点。 – Praetorian 2010-08-15 17:15:52

0

单身和遗传混合在一起非常糟糕。这是因为关于单例的基本陈述是:“只能有一个这个类的实例”,而子类的存在意味着至少存在不同实例的可能性。你几乎可以肯定地重构这个,让这四个类不是单例。