游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2703|回复: 4

设计模式---单件(C++版) 一个简单实例(避免用户忘记dele

[复制链接]

4

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2010-8-30 14:41:00 | 显示全部楼层 |阅读模式
#include <memory>
#include <string>
#include <iostream>
using namespace std;
/**//*
#include <memory>
auto_ptr是可以避免忘记delete如下
auto_ptr<Int> pi ( new Int( 5 ) );
cout << pi->x << endl;
*/

class CSingletonAutoPtr
...{
private:
    static auto_ptr<CSingletonAutoPtr> m_auto_ptr;
    static CSingletonAutoPtr* m_instance;
protected:
    CSingletonAutoPtr();
    CSingletonAutoPtr(const CSingletonAutoPtr&);
    virtual ~CSingletonAutoPtr();
    //allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
    friend class auto_ptr<CSingletonAutoPtr>;
public:
    static CSingletonAutoPtr* GetInstance();
    void Test();
};

CSingletonAutoPtr* CSingletonAutoPtr::m_instance = NULL;
auto_ptr<CSingletonAutoPtr> CSingletonAutoPtr::m_auto_ptr;
CSingletonAutoPtr::CSingletonAutoPtr()
...{
    cout << "CSingletonAutoPtr::CSingletonAutoPtr()" << endl;
    m_auto_ptr = auto_ptr<CSingletonAutoPtr>(this);
}
CSingletonAutoPtr::~CSingletonAutoPtr()
...{
    cout << "CSingletonAutoPtr::~CSingletonAutoPtr()" << endl;
}
CSingletonAutoPtr* CSingletonAutoPtr::GetInstance()
...{
   
    if(m_instance == NULL)
        m_instance = new CSingletonAutoPtr();
   
return m_instance;
}
void CSingletonAutoPtr::Test()
...{
    cout << "CSingletonAutoPtr::Test()" << endl;
}
class CSingletonStaticObj
...{
private:
    static CSingletonStaticObj m_instance;
protected:
    CSingletonStaticObj();
    CSingletonStaticObj(const CSingletonStaticObj&);
public:
    virtual ~CSingletonStaticObj(); //must public
    static CSingletonStaticObj& GetInstance();
    void Test();
};

CSingletonStaticObj CSingletonStaticObj::m_instance;
CSingletonStaticObj::CSingletonStaticObj()
...{
    cout << "CSingletonStaticObj::CSingletonStaticObj()" << endl;
}
CSingletonStaticObj::~CSingletonStaticObj()
...{
    cout << "CSingletonStaticObj::~CSingletonStaticObj()" << endl;
}
CSingletonStaticObj& CSingletonStaticObj::GetInstance()
...{
    return m_instance;
}
void CSingletonStaticObj::Test()
...{
    cout << "CSingletonStaticObj::Test()" << endl;
}


int main()
...{
    CSingletonAutoPtr* pSingleton = CSingletonAutoPtr::GetInstance();
    pSingleton->Test();
    CSingletonStaticObj& singleton = CSingletonStaticObj::GetInstance();
    singleton.Test() ;
    return 0;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hada1234/archive/2007/12/03/1914112.aspx

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-9-5 16:51:00 | 显示全部楼层

Re:设计模式---单件(C++版) 一个简单实例(避免用户忘记d

一个比较懒惰的方法
class Singleton {
private:
    Singleton() {};
public:
   static Singleton* instance(){
          static Singleton inst;
          return &inst;
   }
}

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2010-9-5 22:05:00 | 显示全部楼层

Re:设计模式---单件(C++版) 一个简单实例(避免用户忘记d

其实做了项目你就知道了,这样的单件模式并不是很好,我过去用后来全改掉了,static的玩意释放你不好控制,这种方式是万恶的根源,最好不要用,建议你的程序有个类叫做GameApp,你要啥全局的东西就放这里面,如果还不爽,你就extern一下,让外面好直接去引用,创建和释放顺序你自己完全可以控制,尽量不要用全局的static对象

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2010-9-12 20:11:00 | 显示全部楼层

Re:设计模式---单件(C++版) 一个简单实例(避免用户忘记d

OGRE那种单件才是王道。

而且,游戏软件这个级别的复杂度,用用全局也没什么太大的问题吧。

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-1-15 10:58:00 | 显示全部楼层

Re:设计模式---单件(C++版) 一个简单实例(避免用户忘记d

这个是MONO状态模式吧。。。不算单件?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-6 11:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表