/***************************************************/ /* Zhou Teng all rights Reserve */ /* test.cc 2009-12-30 */ /***************************************************/ #include <iostream> using namespace std; //在C++中使用全局对象大概有这几种方法 //第一种方法就是像MFC那样子直接定义,这 //种方法并不能保证唯一,只能自己把握 class Gobal_1 { public: Gobal_1() { cout << "Methed 1st" << endl; } }; Gobal_1 theGobal; //第二种方法就是使用静态成员,形如: //这种方法的全局对象在main之前就已经 //被初始化了,不太符合lazy的原则 //所以有下面第三种方法 class Gobal_2 { static Gobal_2 gobal_; Gobal_2() { cout << "Methed 2nd" << endl; } public: static Gobal_2& getGobal() { return gobal_; } }; Gobal_2 Gobal_2::gobal_ = Gobal_2(); //第三种方法是对第二种方法的一个变体, //也是用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; }