c++ 单件模式
友情链接:http://happyrxk.cn
在最最早接触面向对象编程时,总是不能从面向过程的编程思想中走出来,不能理解他的那些类,那些实例化是什么意思,等时间久了,慢慢理解了他的意思,感觉面向对象也就那么一回事,就像左面这个图,
一个类实例化出好多个对象来,每个对象都有类的属性,都能用类所定义的函数,不过慢慢才发现,这是远远不够,面向对象编程有很多的设计思想,设计模式,单件模式就是其中一个有时候我们不能凭自己的感觉随便实例化出一个对象,比如上文所说的数据库连接,程序的全局变量,程序的启动只进行一次,再比如说在我前段时间作数据结构的实验课的程序作业时,用的QT来写窗口,有时候需要用到当点击一个按钮时,需要弹出另一个对话窗口,但如果不用到单件的设计设计思想的话,就会出现每点击以下就实例化出一个窗体,像下面这个图一样。
这显然不是我所需要的,所以如果能够用到单件模式,在整个系统中只实例化出一个对话框的窗口的话~~,就能够很好的解决问题了。
说了这么多,c++究竟该怎么实现单件模式呢?it is a question。。。在php里是直接把__construct()函数设为private的。这样每次实例化都会报个致命错误。然后要用的话就直接用类名作为作用域。
<?php class DB{ private function __construct(){ } public static function test(){ echo “test”; } } // $db = new DB(); //这行会报错 DB::test(); //这样会输出 test; ?>
可以看出这样可实现不让用户随便实例化出一个对象来的作用,也是我最早接触的一个设计模式,但在c++中,由它的复杂语法决定了他要实现单件模式并没有上面那么简单,那么具体是怎么实现的~~见下面的代码
class Single { public: static Single & initialize(); private: //这句的意思是把函数的无参构造函数私有化,是它不能在外部无参实例化 Single() { } //这句代码的主要意思是我们需要有参的实例化出这个类,然而由于是单件所 //以必须是private的权限; Single(int s) { } //下面两个是为c++编译器自动生成的复制构造函数而写的,他们也能实例化 //这个类,所以一样~~private~ Single(const Single &s) {} /*下面这句代码在vs2010中可以编译,但在linux下eclipse-cdt无 法通过要改为 void operator=(const Single &s) {} */ Single & operator=(const Single &s) {} void operator=(const Single &s) {} };
对于这个类,我们该怎么实例化它呢~,没错!就是那唯一一个公有函数,可以看出他的类型为static,所以在编译时直接生成所占的内存空间,可以不实例化这个类而直接用,initialize函数就是我们实现单件的对外开放接口,具体实现如下
Single & Single::initialize() { //这个对象也要为static呃~~~要不然每次实例化一个。没有单件的 //意义了。。。。 static Single s; return s; }
在main函数里实例化该单件时要这样:
//此时单件已经为对像single了~~
Single &single = Single::initialize();
如果重复实例化这个类,也是无效的,因为是函数体内的static变量。。。