Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
通常的单态实现大都市如下的形式:
1 class Object
2 {
3 public:
4     Object* Instance();
5 protected:
6 };
7 
8 
(应该是Object* Instance())

获取可以采用如下的模板写法:
1 template<clas T>
2 class Singleton
3 {
4 public:
5     static T* Instance();
6 };
7 

其实可以对其模板写法做一下变形如下:
 1 ////////////////////////////////////////////////////////////
 2 /// 单态模板类(非线程安全的)
 3 ////////////////////////////////////////////////////////////
 4 template <typename Base, typename T> 
 5 class Singleton  
 6 {
 7 public:
 8         
 9     //! 获取对象指针  
10     /*!
11         这里暂时不需要线程安全的版本:) 
12     */
13     static T* Instance()
14     {    
15         if( NULL == instance ) 
16             instance = new T;
17         assert(instance = 0);
18         return instance;
19     };
20 
21     //! 对象指针的析构  
22     static void Deinit()
23     {
24         delete instance;
25         instance = NULL;
26     };
27 
28 private:  
29     static Base* instance; 
30 };
采用双模板参数的手法
这样做的一个好处就是可以通过特定的环境来使用合适的单态版本




posted on 2010-02-05 20:30 ccsdu2009 阅读(1637) 评论(3)  编辑 收藏 引用
Comments
  • # re: c++单态的一个变种实现
    ccsdu2009
    Posted @ 2010-02-05 20:32
    比如:
    Singleton<Audio,OpenALAudio>;
    Singleton<Window,LinuxWindow>;  回复  更多评论   
  • # re: c++单态的一个变种实现
    zmm
    Posted @ 2010-02-06 09:39
    不得不指出这段代码太不严谨,首先在 static T* Instance()中将基类的指针赋给子类,造成编译没有通过,而且在函数后面加;号,也是多此一举。最后对双模板好处的阐释也没说清楚。
    --针对这篇文章的个人看法。  回复  更多评论   
  • # re: c++单态的一个变种实现
    ccsdu2009
    Posted @ 2010-02-06 10:57
    恩 后面的逗号是多余的 谢谢

    双模板好处? 1个是可以避免针对纯虚的单态构造对象
    我不太喜欢写字丷丷
      回复  更多评论   
  • # re: c++单态的一个变种实现
    Goteet
    Posted @ 2010-02-06 12:29
    assert(instance = 0);
    可以考虑看看OGRE里面的那个单态版本。

    template
    class Singleton
    {
    public:
    static T& GetSingleton()
    {
    assert(s_pDerive != 0 && "Singleton::GetSingleton, 未实例化单件.");
    return (*s_pDerive);
    }

    static T* GetSingletonPtr()
    {
    return s_pDerive;
    }

    Singleton()
    {
    assert(s_pDerive == 0 && "Singleton::Singleton, 单件实例已存在.");
    #if defined() && _MSC_VER < 1200
    int iOffset = (int)(T*)1 - (int)(Singleton *)(T*)1;
    s_pDerive = (T*)((int)this + offset);
    #else
    s_pDerive = static_cast (this);
    #endif
    }

    ~Singleton()
    {
    assert(s_pDerive != 0 && "Singleton::~Singleton, 单件实例已销毁.");
    s_pDerive = 0;
    }

    private:
    static T* s_pDerive;
    };

    template
    T* Singleton::s_pDerive = 0;  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理