MyException - 我的异常网
当前位置:我的异常网» C++ » singleton模式中的static解决方法

singleton模式中的static解决方法

www.MyException.Cn  网友分享于:2013-02-05  浏览:22次
singleton模式中的static
Singleton模式的C++实现:
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* m_cpInstance;
};

Singleton* Singleton::m_cpInstance = NULL;

Singleton* Singleton::Instance()
{
if (NULL == m_cpInstance)
{
m_cpInstance = new Singleton();
}
return m_cpInstance;
}
我想问的是:
其中的Instance方法和m_cpInstance是不是必须用static的?
如果是,为什么呢?
如果不是,那么这样用有什么好处吗?

------解决方案--------------------
必须是static,如果你没有创建对象,是不能使用它的非static成员的。static的成员实际是一般的变量和函数,只不过它们的作用域被限制在类范围之内。
------解决方案--------------------
我来说几点:
1. 设计模式还是非常有意思的,要批判设计模式不是不可以,但总得说出具体的、真正的原因,而不能张口无视OO,闭口霸气;
2. 学习设计模式最重要的是掌握其精髓,欲掌握其精髓,往往需要通过编写代码来细细体会。
3. 楼主给出的Singleton实现是线程不安全的。关于Singleton模式,请看:http://topic.csdn.net/u/20100405/22/2adf595b-2f67-4f41-ba44-336faa702069.html?48167,后面有许多其他设计模式的C++实现。
------解决方案--------------------
因为对于外部函数来说,只能通过调用Instance来得到这个唯一的实例。
这在编译的时候就是确定下来的。正因为如此,Singleton* Singleton::m_cpInstance = NULL;这句也不可以少。如果没有这句话,编译都不过。

为了达到“唯一”,只能用static,如果不用static,那么,用户就可以这样使用了:
Singleton a = new Instance();
Singleton b = new Instance();
这就不叫单实例模式了。
------解决方案--------------------
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* m_cpInstance;
};
我也来说几句,这里从另一个角度给大家说一下:
1, 首先:protected:
       Singleton(); 
   这样申明的话,一个程序中可以有他的子类和他自己,就有了两
   所以要将构造函数私有
2, public:
    static Singleton* Instance();
  这个方法必须有static,调用他的时侯没有类的实例对象,要是不加static就没有办法调用了.
3, private:
    static Singleton* m_cpInstance;
  这个加static是因为在Instance中要用到m_cpInstance,面Instance是static的.
  static的方法是不能使用非static的成员的.所以m_cpInstance也要加上static

------解决方案--------------------
因为要保证因为任何时刻 Singleton 类只允许一个实例,
且其的一些成员的状态属性需要长时间保持,
因此,
如果 m_cpInstance 必须是static,
static 对象的生命期为其构建到程序退出,
且staic只能被初始化一次,这样的就能保证
if( NULL!= m_cpInstance )
{ m_cpInstance = new Singleton;}
只会构建一个实例;

而只有static 函数访问 static成员,(也许效率上会好些?)
static Singleton* Instance();

------解决方案--------------------

楼主,你的代码应该改成这样:[/code]
//Singleton模式的C++实现:
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
//static Singleton* m_cpInstance; //不要写在这个地方,因为不能保证初始化
};

Singleton* Singleton::Instance()
{

//现在改成这样
 static Singleton value; //能保证初始化。

return &value;
}

[/code]


另外:
关于楼上各位的答复,我提出我的看法:
设计模式的作用就在于构造大型程序。
当你写一个大型程序时,如果是用C++写或者其他面向对象语言写的话,不用设计模式,
那么当你以后碰到需要更改设计,更改代码,或者移植代码,或者更改配置的时候,你将会发现你
突然寸步难行。因为很少用过设计模式,你的代码变得强耦合,模块之间关系不明确,更改一个地方牵涉到其他许多地方的更改,这时,你会突然需要一个好的解决方案,比如如何在不同的平台上使用不同的配置? 如何全局替换一个算法但不改变代码?如何将底层实现与界面显示分离,达到一个核心代码能够方便移植到不同的界面上?这就是一种设计模式。

对于喷设计模式的人,我不发表任何言论,各有所爱嘛!!反正设计模式的使用我个人是在自己的项目中收益匪浅,设计模式麻烦的地方就是对模式的理解和模式的建立,所以比一般的编程需要更多的时间和精力,但是建好模式后,修改和维护都很方便。

学习设计模式也便于我们理解一些C++开源项目的代码,很多开源项目的代码都用到了设计模式,或者说是设计模式的 C++ 版。。
从别人的设计模式代码中得到启发,然后用在自己的代码中,逐渐提升自己的设计功力,然后你会发现,其实那些设计模式正是前辈们以往设计经验的结晶,并逐渐体会一个模式对于解决项目中设计问题的巨大功力。当一个解决方案成熟的时候,以后碰到类似的问题,你都会找到相应的设计模式来解决了。

PS:有感而发,不要介意哟~~~。

文章评论

什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
代码女神横空出世
代码女神横空出世
程序员都该阅读的书
程序员都该阅读的书
我是如何打败拖延症的
我是如何打败拖延症的
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
老程序员的下场
老程序员的下场
每天工作4小时的程序员
每天工作4小时的程序员
鲜为人知的编程真相
鲜为人知的编程真相
10个调试和排错的小建议
10个调试和排错的小建议
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员和编码员之间的区别
程序员和编码员之间的区别
为什么程序员都是夜猫子
为什么程序员都是夜猫子
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
旅行,写作,编程
旅行,写作,编程
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
一个程序员的时间管理
一个程序员的时间管理
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
我的丈夫是个程序员
我的丈夫是个程序员
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
那些争议最大的编程观点
那些争议最大的编程观点
如何成为一名黑客
如何成为一名黑客
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员的鄙视链
程序员的鄙视链
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有