您的位置:首页 > 编程语言 > C语言/C++

C++中使用全局变量方法

2010-01-28 16:29 507 查看
/***************************************************/
/*  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: