C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++实现单例模式

Posted on 2011-12-21 14:41 C小加 阅读(17867) 评论(15)  编辑 收藏 引用 所属分类: 设计模式C++和面向对象
单例模式:Singleton 
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

我实现了一个简单的单例类,欢迎吐槽。
#include<iostream>
using namespace std;

class Singleton
{
public:
    
static Singleton * GetInstance()//通过静态公有函数获得该类的实例对象
    {
        
if(m_pInstance==NULL)
        m_pInstance
=new Singleton();
        
return m_pInstance;
    }

private:
    Singleton(){}
//构造函数私有化的目的是为了防止从别处实例化该类对象
    static Singleton * m_pInstance;
    
class Garbo//删除Singleton实例的对象
    {
    
public:
        
~Garbo()
        {
            
if(Singleton::m_pInstance)
            {
                delete Singleton::m_pInstance;
            }
        }
    };
    
static Garbo gb;//在程序结束时,系统会调用它的析构函数
};
Singleton 
* Singleton::m_pInstance=NULL;//初始化静态数据成员

int main()
{
    Singleton 
*sl=Singleton::GetInstance();
    
return 0;
}

Feedback

# re: C++实现单例模式  回复  更多评论   

2011-12-21 20:56 by right
提几个问题吧
1.线程安全
2.单件对象与对象彼此依赖,析构可能出现问题
3.必须从此类派生

有时候想想,单件这东西真是有点多余,文档齐全命名规范的全局变量或全局函数完全不会有问题。

# re: C++实现单例模式  回复  更多评论   

2011-12-21 22:27 by C小加
多线程析构的时候会出很多问题吧,我只是一个学生,能不能详细讲解一下此类的一些问题啊@right

# re: C++实现单例模式[未登录]  回复  更多评论   

2011-12-21 22:31 by leo
google 双检锁

# re: C++实现单例模式  回复  更多评论   

2011-12-22 22:46 by 远行
觉得你那个类中类的作用至少从逻辑上是多余的,类中的静态成员,在程序结束时候析构,你new的唯一实例,既然用户代码不手动删除这个实例,也是在程序结束时析构的,这样你的类中类实现就没有任何实际意义了

# re: C++实现单例模式  回复  更多评论   

2011-12-22 22:54 by C小加
你的意思是new 的对象不用delete了??这。。。@远行

# re: C++实现单例模式  回复  更多评论   

2011-12-23 19:35 by 远行
你应该用更好的设计方法。@C小加

# re: C++实现单例模式  回复  更多评论   

2011-12-23 21:31 by C小加
new的对象如果不delete的话,程序结束也不会析构的,或者你手动delete,或者自动delete,我只知道这一种自动delete的方法。@远行

# re: C++实现单例模式  回复  更多评论   

2011-12-31 21:42 by 代东升
程序结束后堆栈都被清理了,没有实际意义。

# re: C++实现单例模式  回复  更多评论   

2012-01-16 22:52 by C小加
在堆上申请的内存能保证程序结束后被系统系统清理?@代东升

# re: C++实现单例模式  回复  更多评论   

2012-05-17 17:17 by 吾问无为谓
啊啊啊啊啊啊

# re: C++实现单例模式  回复  更多评论   

2012-06-20 12:02 by cobain
你应该禁掉拷贝构造和拷贝赋值操作符,不然你这也不是单例了。

# re: C++实现单例模式  回复  更多评论   

2012-09-13 13:55 by abel
if(m_pInstance==NULL)
{
static Singleton instance;
m_pInstance = &instance;
}
return m_pInstance;

# re: C++实现单例模式  回复  更多评论   

2013-04-11 14:10 by 陈文斌
你没发现有内存泄露吗

# re: C++实现单例模式  回复  更多评论   

2013-08-02 19:00 by 宋欢
应该要DELETE的

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