一种类静态成员初始化的方案,高手可以看看
众所周知c++缺少一个重要的机制,类成员静态初始化构造函数,如下例
class foo
{
private:
static int m_i =0; //这一句会报错
static const int m_j = 1; //ok
};
我们必需改成在cpp文件中加上 int foo::m_i =0;
现在问题来了,假如程序员A写了一个库,它用到了类静态成员,那么客户程序员需要在他的代码中对其进行初始化,但是如果有多个程序员都分别用到这个库,并且他们都共同完成同一个程序,会有什么样的问题呢?我想灾难是最好的形容。
因此我想大部分的c++程序员希望有一个类似于C#中的静态成员初始化构造函数吧,如下
class foo
{
public:
static foo()
{...}
};
但目前c++标准好象并没有想法去支持它!
我想了很久提出一种解决办法,大家看看如何
1) 利用函数体内的局部静态变量
2) 利用古老的宏
具体定义如下:
#define STATIC_VAL(type,valname,initval) \
static type & static_m_##valname() \
{ \
static type m_##valname = initval; \
return m_##valname; \
}
#define STATIC_VAL_REF(valname) static_m_##valname()
class CTest
{
public:
CTest()
{
++ STATIC_VAL_REF(i);
}
~CTest()
{
-- STATIC_VAL_REF(i);
}
int get_i()
{
return STATIC_VAL_REF(i);
}
static void print()
{
printf("%s\n",STATIC_VAL_REF(msg));
}
private:
STATIC_VAL(int,i,0)
STATIC_VAL(const char*,msg,"this is")
};
STATIC_VAL:完成静态变量的定义
STATIC_VAL_REF 取得静态变量的引用
大家觉得这种方法有什么弊端么,另外我不是很清楚,如果在一个DLL中,函数体内的静态变量初使化是在什么时候。