C++中复杂静态数据成员的初始化

时间:2022-09-09 20:09:21
C++问题:在类A中,如果初始化一个复杂的对象O,需要N步的操作完成,对于非静态数据成员,直接在构造函数中处理就可以了,而对于静态数据成员,如何进行初始化? a.         在构造函数中初始化,可以用if语句判断,每次生成对象的时候都会调用。 b.         在静态成员函数中初始化,但是这个静态成员函数需要自己调用,但是由于不知道什么时候第一次调用静态数据成员,所以没有保证。 c.         此类再包含一个静态数据成员,这个静态数据成员初始化的时候调用其构造函数,而构造函数的内容就是初始化以上的复杂对象的。所以这个复杂的静态数据成员是在类第一次使用之前初始化的。而且不用我显示调用,就和这个静态数据成员初始化的时机完全一致。只不过需要多一个类定义和一个静态数据成员。静态数据成员的初始化是由编译器完成的,在main()函数执行之前。 但是静态数据成员初始化的代码与类是分开的,有点问题。 d.   方法差不多同上,但是将用于初始化的一个类Init定义作为内部类来声明,将用于初始化的静态数据成员I也定义在内部类Init中,并且将它们都定义为private。这样静态数据成员O初始化的代码和这个类A保持紧密关联,初始化过程对外部隐藏,用于初始化的对象也对外部隐藏,这样还能够保持类A的清洁,保证类的封装性、独立性。 当然个人认为最好的方法是d,所以给出了实现代码:

#include <map>
#include <string>
#include <iostream>

class A
{
 //内部类用于初始化method_access_flags。
private:
 class Init
 {
 private:
 Init();
 static Init i;
 };

public:
 //需要初始化的静态数据成员
static std::map<unsigned short, std::string> o;
};

//这里必须先定义o
std::map<unsigned short, std::string> A::o;
//这里的定义是必须的,用于调用初始化
A::Init A::Init::i;

A::Init::Init()
{
typedef std::pair<unsigned short, std::string> element;
A::o.insert( element(0x0001, std::string("ACC_PUBLIC")) );
A::o.insert( element(0x0002, std::string("ACC_PRIVATE")) );
A::o.insert( element(0x0004, std::string("ACC_PROTECTED")) );
A::o.insert( element(0x0008, std::string("ACC_STATIC")) );
A::o.insert( element(0x0010, std::string("ACC_FINAL")) );
A::o.insert( element(0x0020, std::string("ACC_SYNCHRONIZED")) );
A::o.insert( element(0x0100, std::string("ACC_NATIVE")) );
A::o.insert( element(0x0400, std::string("ACC_ABSTRACT")) );
A::o.insert( element(0x0800, std::string("ACC_STRICT")) );
// ....
}