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

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")) );
// ....
}

 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值