单件模式的C++示例

C/C++ No Comments »

     之前花过一段时间学习设计模式,现在对于很多模式只留下一些感性的认识了。最常用的设计模式是策略模式 、工厂模式;最有用的设计原则是封装、组合>继承。
      以前的项目中大家为了简化往往忽视了设计模式的存在,这往往造成了项目维护的困难。现在又要进行新的代码编写了,希望能在设计之初考虑到这些问题,也方便以后代码维护的人。
      今天我记录一个简单的模式:单件模式。单件,毫无疑问就是独一无二的对象,其实在程序中这种对象有很多,例如存储系统配置信息的对象、接受和发送socket或是其他消息的对象、存储一些全局信息的对象,这些对象在系统中都是唯一的,它们建立好之后将不会销毁,直到程序终止(当然独一无二不意味着不销毁)。
      下面还是用代码说话把,下面代码位于三个文件中,分别为:configurator.h(Configurator类的定义头文件)、configurator.cpp(Configurator类的方法实现文件)、test_singleton.cpp(测试文件)。在C++中文件的划分是很重要的,这在大型程序中尤其如此,关于头文件的定义大家可以参考C++ Prime,上面讲的还是挺好的。(曾经又一次错误的在头文件中写下了using namespace std;结果导致各种莫名奇妙的编译错误,汗啊~)

FileName: configurator.h

#ifndef _CONFIGURATOR_H_
#define _CONFIGURATOR_H_

//this class has only one instance.
class Configurator{
	public:
		static Configurator* only();

		void setFlag(int newFlag);
		int getFlag();

		//NOT IMPLEMENTED ,AVOID MISUSE.
		Configurator(const Configurator&);
		Configurator& operator=(Configurator);
	private:
		//if it  has child class, the Constructor should be protected.
		Configurator();

		static Configurator* instance;

		int flag;
};
#endif

FileName: configurator.cpp

#include <iostream>
#include "configurator.h"

using namespace std;

Configurator* Configurator::instance=NULL;

Configurator::Configurator():flag(2){
 cout<<"I have been builded."<<endl;
}

Configurator*  Configurator::only(){
//if you want destory the class after use,you can do define instance here

//static Confiugrator * instance=NULL;

 if(instance==NULL){
  instance= new Configurator;
 }
 return instance;
}

void Configurator::setFlag(int newFlag){ 
 flag = newFlag;
}

int Configurator::getFlag(){ 
 return flag;
}

FileName: test_singleton.cpp

#include <iostream>
#include "configurator.h"

using namespace std;

int main(){

 cout<<"start building Configurator."<<endl;
 Configurator* first = Configurator::only();
 cout<<"first: flag is:"<<first->getFlag()<<endl;
 first->setFlag(7);
 cout<<"first: flag is:"<<first->getFlag()<<endl;

 //the other block.
 {
  Configurator* second=Configurator::only();
  cout<<"second: flag is:"<<second->getFlag()<<endl;
  second->setFlag(9);
  cout<<"second: flag is:"<<second->getFlag()<<endl;
 }

 cout<<"now first: flag is:"<<first->getFlag()<<endl;

}

编译并运行:

 # g++ configurator.cpp test_singleton.cpp
 # ./a.out

代码的运行结果如下:

start building Configurator.
I have been builded.
first: flag is:2
first: flag is:7
second: flag is:7
second: flag is:9
now first: flag is:9

从Configurator类的定义中可以看出它和普通类的定义所不同的有以下几点:

    1 、构造函数被定义为private,(如果有子类可以定义为protected),即对于外界不能通过构造函数来得到实例类型。如果你试图定义一个Configurator myCfg;编译时就会报错;获得实例变量的唯一办法就是调用only类方法,这也就保证了类的唯一性。

      [题外话]调用类的默认构造方法时应该写成Configurator myCfg; 而不是 Configurator myCfg();因为后者编译器会认为是方法的定义。

      2、为了进一步保证类的唯一性,在定义中把“构造拷贝函数”、“赋值函数”只进行声明而没有定义,这样可以防止某些人拷贝此单件类。如果试图拷贝的话可以通过编译,但链接时会报错(因为找不到对应的方法)。

       3、单件类包含有一个private的指向自己类型的指针,并且此指针定义成static类型,即全局的指针,可以用于指向此单件对象,并保证此对象的唯一性。

       众所周知,C++是支持全局变量的(当然也可以是全局的类变量),但是全局变量的出现使得程序文件中充斥了extern等字样,很多人提倡取消全局变量,它有很多缺点,其中包括降低代码的可读性,增加代码的维护难度,但全局方法有一个很大的优点:简单。不过我们还是应该尽量不用全局变量,相比而言,单件模式就是一个很好的解决方案,它可以让代码更易与维护并且避免一些不必要的错误。

      [题外话]很多事情存在都有它存在的理由,在实际中我们需要进行权衡,我们选择的不一定是最好的,但一定应该是最适合自己的。

[转]推荐视频:大自然中的数学

BrainStorm 2 Comments »

时常感叹,造物者一定是一个数学家,能把数学之美如此完美地融入自然界。
国外网友制作的这个短片向大家展示了大自然中令人震撼的数学之美,非常漂亮,值得一看:

YouTube 链接:http://www.youtube.com/watch?v=kkGeOWYOFoA

本文转自matrix67.com,原文地址:http://www.matrix67.com/blog/archives/3004

养成使用快捷键的习惯

Tips No Comments »

长久以来使用电脑很少使用快捷键,除了几个基本的快捷键如Ctrl+C,Ctrl+V之外对于其他快捷键大都很陌生,或许是习惯了用鼠标点来点去吧。后来有了笔记本电脑,由于笔记本的触摸板操作起来很麻烦,自己也开始慢慢学习用一些快捷键。快捷键还是可以提高我们的工作效率的,而且也可以让我们看起来牛一点,呵呵。

下面介绍我觉得有用的一些快捷键(主要是windows下面的,有些在linux下也是可以用的,可以自己试试)

1、Delete和Shift+Delete:两者都可以删除选中的项目,如果是文件的话,前者是删除选中的文件到回收站,后者是直接删除文件,而不是放到回收站

2、Ctrl+C, Ctrl+V:复制和粘贴(最常用);Ctrl+X:剪切

3、Ctrl+Z:撤销上一步操作(在一般的文本编辑工具中都是这个快捷键,个人感觉很好用)Ctrl+Y:重做撤销后的操作(并不是多有的编辑器都支持)

4、Ctrl+F:查找某个字段(一般编辑器都支持,一般浏览器也支持)。

5、Ctrl+S:保存文件(很常用)

6、Ctrl+A:全选文本或是当前目录下的所有文件(常用)

7、 Ctrl+N:新建一个文件;Ctrl+O:打开某个文件

8、Alt+Space:显示当前程序的系统菜单(主要是选择最小化,关闭,最大化等),按下后选择相应的键来完成相应的功能,这个快捷键在linux也是支持的

9、Ctrl+Space, Ctrl+Shift:前者是中英文切换,后者是所有输入法间的切换(常用)

10、Alt+Tab:多个开启的应用程序之间的切换(常用)

11、Alt+F4:关闭当前应用程序(常用);Ctrl+F4:关闭当前应用程序的当前子窗口

12、Windows+R:启动运行窗口,可以学着用一下

13、Ctrl+Alt+Delete:启动任务管理器

下面是一些其他程序的常用快捷键

1、qq程序中的 Ctrl+Alt+Z :接收qq收到的消息。

2、在浏览器的地址栏中输入xxx,然后输Ctrl+Enter,这时浏览器会自动进行命令补全,http://www.xxx.com/

3、Ctrl+鼠标滚轮 :可以放大缩小当前的浏览器的窗口中的字体

4、Ctrl+D:将当前页加入到收藏夹

5、Alt+D:选择地址栏

6、F5:刷新当前页面;ESC:取消(也可以关闭一些窗口,例如qq的聊天窗口);Enter:确认

7、Shift+方向键:在文本编辑器中选择光标周围的文本(好用)

先写这些吧,以后发现什么好用的再进行补充。如果大家发现什么好用的快捷键也欢迎留言补充。。。

博客新家

日志 2 Comments »

     现在终于有自己的网站了,以后会一直用这个网址了,呵呵。之前的yo2的网站后来被GFW了,虽说数据现在恢复过来了,但弄的也挺郁闷的,现在再也不用担心这个问题了。再此要感谢我的小学弟,要不是他的帮忙不知道要花多久网站才能运作。

    下面简单记录一下建站的过程,方便有兴趣建站的朋友。建立个人网站需要有自己的域名和空间。

1、域名的申请在国外申请比较方便,我是在www.godaddy.com上申请的,而且可以马上开通。当然了,申请之前你要保证这个域名没有被用过,可以通过www.whois.com来查询该域名是否已经有人注册了。(如何起域名就看个人的水平了,我的水平也不是很高,呵呵)

2、申请个人的空间,我个人是购买的布置在国外的个人主机,网上有很多提供合租主机服务的站点,大家可以在网上搜一下,我是用的www.gegehost.com的主机,据说挺好用的。

3、获得空间后可以看到远程主机的ip地址,然后进入www.godaddy.com 的网站,然后进入个人域名的管理,然后把域名绑定到这个ip就可以了。

4、最后就需要在远程的主机上建立相应的数据库,上传wordpress安装程序,然后安装好wordPress就可以了(wordpress的安装可以参考网上的教程,注意一点就是编辑config文件时请用高级点的文本编辑器,不要用记事本)。

     远程主机的功能很强大,基本可以和在本地操作文件一样方便,可以实现文件的移动、复制、删除、压缩、解压等。数据库的操作也比较简单,也有phpMyAdmin等工具可以使用。

建站容易维护难啊,呵呵,希望自己能认真做好维护工作吧。。。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS 登录