C++中多语句创建“类成员变量”

1 初始设计

1 需求说明

因为业务背景需要,需要做以下需求:

1, 定义一个属于“类”的成员变量,即所有对象都可以访问这个成员。
2, 这是一个“复杂的类成员”,即是一个复合类型,如map, vector等。
3, 初始化这个类成员,需要多条语句才能初始化,如需要for,条件判断。

2 代码设计

// A.h
#include <map>
class A {
public:
    A();
    static int getBool(int index); // 静态函数,开放接口访问map
private:
    //只在类创建的时候,调用一次
    static std::map< int, bool> contructData(); 
private:
    // 只在类创建的时候,初始化一次
    static const std::map<int, bool> m_data; 
};

下面是函数定义

// A.cpp
const std::map<int, bool> A::m_data = A::contructData();

std::map<int, bool> A::contructData() {
    std::map<int, bool> tempData;

    for (int i = 0; i< 5; ++i) {
        tempData.insert(std::pair<int, bool>(i+1, false));
    }
    return tempData;
}

2 进一步设计

显然,进一步增加需求,还可以完善代码:
1, 初始化的函数,不需要访问“类内”定义的常量。由于每个源码文件是一个编译单元,因此可以将该函数限制在当前的命名空间:

namespace {
	std::map<int, bool> contructData() {
	}
}

2,如果成员变量m_data只有函数"getBool()"访问,则可将该成员变量移入函数“getBool()”中进行创建.此时data依然只是创建一次。若使用const修饰,则无法改变map中的数据。

int A::getBool(int index) {
    static const std::map<int, bool> data = contructData();
    ......
    // do something
}

3 知识拓展

1, static const和const static 意义相同,没有区别。
2, 函数中的static变量,只初始化一次,当再次调用该函数,static变量不会再次被初始化。
3, static变量是复合对象,且其成员为指针,如下面形式,则const只是对std::map的修饰,即一经初始化,该map不能再做改变,但是其内容可以做出改变,map中的int*指向的数据依然可以被修改。

static const std::map<int *, int *> data

若想进一步控制map中内容也不被修改,可使用下面代码:

static const std::map<const int *, const int *> data

猜你喜欢

转载自blog.csdn.net/zhizifengxiang/article/details/78937717
今日推荐