在开发的时候会遇到这种情况,就是在执行某些功能的时候要对一些环境变量或配置信息进行修改,功能执行完毕之后再把这些变量或配置信息设置恢复回去。举个例子:有些游戏只能在分辨率为800*600的环境下运行,如果要在分辨率1024*768的电脑上玩,就要在运行游戏的时候把分辨率改为800*600,退出游戏的时候再把分辨率改回1024*768。
其实处理这样的情况也不是很难,我们可以写一个设置环境变量或配置信息的函数和恢复环境变量或配置信息的函数,在调用某项功能函数之前调用设置函数,之后调用恢复函数。可能会有如下的伪码片断:
......
Set();
DoSomething();
Resume();
......
如果有很多地方都有类似上面的伪码,那么就得要求程序员牢记在调用功能函数之前和之后分别调用设置和恢复环境变量或配置信息的函数。那有没有更好的办法来解决这种问题呢?
答案是,有!
我们知道构造函数的主要作用是完成对类对象的初始化工作,而析构函数的作用与构造函数相反,在对象的生命期结束的时候,由系统自动调用。那么我们就可以把设置环境变量或配置信息的功能在构造函数里面实现,而在析构函数中实现对环境变量或配置信息的恢复。那样我们只要在调用功能函数之前声明一个局部变量,构造函数会对环境变量或配置信息进行设置,而在作用域结束的时候,系统会自动调用析构函数来恢复环境变量或配置信息。下面以一个简单的例子来说明:
class ClxBeginEnd
{
public:
ClxBeginEnd();
~ClxBeginEnd();
};
// 这里以输出一句话来代替对环境变量的设置和恢复
ClxBeginEnd::ClxBeginEnd()
{
cout << "Output from constructor of clss ClxBeginEnd!" << endl;
}
ClxBeginEnd::~ClxBeginEnd()
{
cout << "Output from destructor of clss ClxBeginEnd!" << endl;
}
void lxTest()
{
// 声明一个局部变量
// 构造函数会实现对环境变量或配置信息的设置
// 在作用域结束的时候,析构函数会恢复环境变量或配置信息
ClxBeginEnd lx;
// 这里以输出一句话来代替实际的功能实现
cout << "Do something in function lxTest!" << endl;
}
输出结果很明显:
Output from constructor of clss ClxBeginEnd!
Do something in function lxTest!
Output from destructor of clss ClxBeginEnd!
这样,就可以用一行声明变量的代码实现对环境变量或配置信息的设置和恢复。省去了在实现功能之前和之后分别调用两个函数的麻烦。为了帮助记忆,可以给这个类起一个更好记、更能表明含义的名字。下面就是一个例子:
typedef struct ConfigSetResume_
{
ConfigSetResume_();
~ConfigSetResume_();
}ConfigSetResume;
之所以用结构体,是因为这样写起来比较简单。我们知道,在C++中,类和结构体本质上是一样的。它们的区别就在于,类的成员默认是私有的,而结构体的成员默认是公有的。