2010-12-16 71 views
0

我有两个班,Basic类模板在C++

class CFoo 
{ 
    public: 
     static CFoo& GetInstance() 
     { 
     static CFoo instance; 
     return instance; 
     } 

     int GetValue(){ 
     return value; 
     } 

    private: 
     CFoo(){ 
     value = 0; 
     ltr = 'a'; 
     } 

     int value; 
     char ltr; 
}; 

class CBar 
{ 
    public: 
     static CBar& GetInstance(){ 
     static CBar instance; 
     return instance; 
     } 

     float GetValue(){ 
     return value; 
     } 

    private: 
     CBar(){ 
     value = 0.4; 
     ltr = 2; 
     } 

     float value; 
     int ltr; 
}; 

是否有可能只是为了创建此两类一类模板,不同的仅仅是数据类型。而且由于这个类是一个单例,当我为这两个类创建一个模板类时,我该如何调用?请给出基本模板类的示例代码。

请指教。

非常感谢。

+1

这是一个奇怪的单例实现,每次调用'GetInstance()'时都会返回一个新实例。 – 2010-12-16 03:51:31

+0

@Fred Larson,实例对象是静态的,所以基本上它不会创建实例尚未销毁的情况。 – domlao 2010-12-16 03:54:00

+1

但是,您要按价值归还,因此每次致电时都要寄回一份副本。 – 2010-12-16 03:56:33

回答

6

一般来说,当你想推广类似这样的类时,你可以通过用类型参数替换每个类型来实现。因此,例如,在此,您将声明value类型的类型参数和ltr类型的类型参数。

显然,这看起来像:

template <typename ValueT, LtrT> 
class C 
{ 
    // ... 
}; 

然后,它只是一个在类的类型参数取代了具体类型的事情,所以valueltr将被宣布为(内部类的模板定义):

ValueT value; 
LtrT ltr; 

为了使这个类模板更容易使用,你可以创建一些类型定义(类模板定义的)以外:

typedef C<int, char> CFoo; 
typedef C<float, int> CBar; 

您还需要一种方法来初始化成员变量。最好的办法是使构造带参数用来初始化成员变量(类模板定义内):

C(const ValueT& initial_value, const LtrT& initial_ltr) 
    : value(initial_value), ltr(initial_ltr) { } 

既然你试图用一个单,这会不会与您当前工作(破坏)的实现GetInstance(),因为功能范围的静态需要在函数体中初始化。您可以解决此通过声明单实例作为类的静态成员变量(类模板定义内):

C singleton; 

,那么你需要定义和源文件中的一个初始化这一点;你将需要为您使用的C每个实例化一个定义,所以两个你在这里,你将需要:

template<> CFoo CFoo::singleton(0, 'a'); 
template<> CBar CBar::singleton(0.4, 2); 

当你把它放在一起,它会是这个样子(I”已经简单化下来只使用单一类型和价值为简洁起见):

template <typename T> 
struct S 
{ 
public: 
    S(const T& initial_value) : value(initial_value) { } 

    const T& GetValue() const { return value; } 

    static const S& GetInstance() { return singleton; } 

private: 
    // since it's a singleton, make it noncopyable 
    S(const S&); 
    void operator=(S); 

    T value; 
    static S singleton; 
}; 

typedef S<int> SInt; 

template<> SInt SInt::singleton(42); 

int main() 
{ 
    int value = SInt::GetInstance().GetValue(); 
} 

最后,也是最重要的是,请考虑不使用一个单身。单身汉几乎总是一个坏主意。不可能告诉你正在试图从你的精简示例中完成什么,但是你绝对应该尝试找到其他方法来完成它。

+0

如何调用此模板类或创建的实例,因为它是单例? – domlao 2010-12-16 03:51:49

+0

初始化成员变量怎么样? – sje397 2010-12-16 03:52:21

+0

+1,特别是针对单身人士推荐。 – 2010-12-16 03:54:12