//第三种方法是对第二种方法的一个变体,
//也是用static做玩来的,很多设计模式的
//东西都是在static这个关键字上面做文章
//第三种方法带来的好处是,等到要用的时候
//才初始化这个全局对象,但问题就是,最后
//必须使用releaseGobal()去释放这个全局对象,
//否则发生内存泄露
class Gobal_3
{
static Gobal_3* gobal_;
Gobal_3()
{
cout << "Methed 3rd" << endl;
}
Gobal_3(Gobal_3&);
Gobal_3 operator=(Gobal_3&);
public:
static Gobal_3* getGobal()
{
return gobal_ ? gobal_ : gobal_ = new Gobal_3();
}
void releaseGobal()
{
delete gobal_;
gobal_ = NULL;
}
};
Gobal_3* Gobal_3::gobal_ = NULL;
//这样子弄之后,有人发现如果要从这个类
//派生出一个子类,实现全局对象的话,就
//必须把构造函数弄成public,但是public
//的构造函数会带来一系列的问题,比如,
//不能限制该类对象的个数等等。所以,诞生
//了第四种方法
#define DECLARE_GOBAL(classname) /
public: /
static classname* getGobal() /
{ /
return gobal_ ? gobal_ : gobal_ = new classname(); /
} /
void releaseGobal() /
{ /
delete gobal_; /
gobal_ = NULL; /
} /
private: /
static classname* gobal_; /
classname() /
{ /
cout << "Methed nth" << endl; /
} /
classname(classname&); /
classname operator=(classname&);
#define IMPLEMENT_GOBAL(classname) /
classname* classname::gobal_ = NULL;
class Gobal_4
{
DECLARE_GOBAL(Gobal_4)
//other declare
};
IMPLEMENT_GOBAL(Gobal_4)
//是不是觉得第四种方法很眼熟,但是又想不起
//在哪里见过,我告诉你吧,在MFC可能有这么一
//个东西,DECLARE_SERIAL和IMPLEMENT_SERIAL
//就是序列化那一个宏,不清楚可以查看MSDN:
//Serialization: Making a Serializable Class
//第二种方法也可以写这样子的宏,这里不罗嗦。
//那有没有集成第二和第三种方法的优点的方法
//C++好像没有什么是impossible,所以看下面第五
//种方法。
class Gobal_5
{
Gobal_5()
{
cout << "Methed 5th" << endl;
}
Gobal_5(Gobal_5&);
Gobal_5 operator=(Gobal_5&);
friend class Inner; // C++的内部类跟Java的不一样的地方
class Inner
{
Gobal_5* gobal_;
public:
Inner()
: gobal_(NULL)
{
}
~Inner()
{
delete gobal_;
gobal_ = NULL;
}
Gobal_5* getGobal()
{
return gobal_ ? gobal_ : gobal_ = new Gobal_5();
}
};
static Inner inner_;
public:
static Gobal_5* getGobal()
{
return inner_.getGobal();
}
};
Gobal_5::Inner Gobal_5::inner_ = Gobal_5::Inner();
int main()
{
return 0;
}