//取得相关值
static int getFlag() { return s_flag_; }
static int getSize() { return s_size_; }
static const char* getInmodulename() { return s_in_modulename_; }
};
相信这种重构方法通过引入类的封装和静态成员函数的访问来解决全局的问题应该是一个比较好的方法。
4. 解决初始相互依赖问题
如果你让对象A必须在对象B之前初始化,同时又让A的初始化依赖于B已经被初始化,同是A,B又在不同的编译单元,这是我们就无法控制正确的初始化顺序,解决办法还是有的(注,以下直入引用《think in C++》的一段例子,由于是总结,拷贝一段没问题吧),
这时我们可用由Jerry Schwarz在创建i o s t r e a m库(因为c i n , c o u t和c e r r的定义是在不同的文件中)时提供的一种技术。这一技术要求在库头文件中加上一个额外的类。这个类负责库中静态对象的动态初始化。下面是一个简单的例子:
//DEPEND.H – Static initialization technique
#ifndef DEPEND_H_
#define DEPEND_H_
#include <iostream.h>
extern int x;//Delarations,not definitions
extern int y;
class initializer{
static int init_count;
public:
initializer(){
cout <<"initializer()"<<endl;
if(init_count++ == 0)
{
cout <<"performing initialization"<<endl;
x = 100;
y = 100;
}
}
~initializer(){
cout<< "~initializer()"<<endl;
if(--init_count == 0){
cout << "performing cleanup" <<endl;
}
}
};
//The following creates one object in each
//file where DEPEND.H is included ,but that
//object is only visible within that file:
static initializer init;
#endif //DEPEND_H_
x、y的声明只是表明这些对象的存在,并没有为它们分配存储空间。然而initializer init 的定义为每个包含此头文件的文件分配那些对象的空间,因为名字是static的(这里控制可见性而不是指定存储类型,因为缺省时是在文件范围内)它只在本编译单元可见,所以连接器不会报告一个多重定义错误。
下面是一个包含x、y和init_count定义的文件:
//:DEPDEFS.CPP--Definition
#include “depend.h”
//Static initialization will force
//all these values to zero:
int x;
int y;
int initializer::init_count;
(当然,一个文件的init静态实例也放在这个文件中)假设库的使用者产生了两个其他的文件:
//:DEPEND.CPP—Static initialization
#include “depend.h”
和
//:DEPEND2.CPP –Static initialization
#include “depend.h”