C++类中有一个static map ,请问如何初始化呢

bosimaoxiaoyu 2008-03-21 04:46:29
C++类中有一个static map ,请问如何初始化呢
...全文
11530 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-04-16
  • 打赏
  • 举报
回复 1
Jack_GH 2011-04-16
  • 打赏
  • 举报
回复
初始化map的问题在于要给map附一个初始值,通常是想拿map当做哈希表来用。
可是map的默认构造中不能像c中的数组一样直接赋值 int a[6]={1, 2, 3};
假如map类型的对象a是某一个类的一般成员变量(没有static修饰),那么a可以在构造函数中赋值完成实例化
sth()
{
a[0]=1
...
}
如果有static修饰的话,static变量初始化的语法是: <数据类型><类名>::<静态数据成员名>=<值>
即: map<int,int> sth::a;
这时候就默认的构造了一个空的map,接下来想要像全局函数一样赋值: sth::a[0]=1是不可以的
只能把赋值定义在某个函数中,这样的话只有在函数在调用的时候,map变量才会被初始化。
可是问题是我们的期望是在执行main之前并且在类的构造函数调用之前,这个map变量就已经实例化
并且已经赋值。因为在某些类的实例化过程中,需要使用map变量中的值。

解决方案:
> 先定义一个全局生存期的数组,用数组来初始化它。
可是如果已经有这样一个全局数组的话,那么这个map变量显得就多余了。另外怎么用它初始化这个map变量?
> 使用超强的boost::map_list_of
对于map来说这是一个解决方案,但是如果我们下次要初始化的不是static map, 而是static vector呢?其实这一个问题可以更普遍,这个问题可以描述成初始化一个static型的容器。
> 我想到的一个解决方案,虽然看起来也挺古怪的,但是要比上两种稍好点
1. 首先定义一个类
class init
{
inline init(map<int, int>& a) {// 初始化 a};
};
2. 在包含map<int,int> a的类sth中, 声明一个init类型的static变量
class sth
{
static map<int, int> a;
//
static init buildMap;
};
3. 调用buildMap的有参构造并将a传进去
init sth::buildMap(a);

这样a在buildMap调用构造函数的时候被实例化
class init
{
inline init(map<int, int>& a) {// 初始化 a};
};
buildMap的构造是在类构造之前,所以a的初始化也在类构造之前。

还是有点丑因为,莫名其妙的多了一个类init和我们要解决的业务逻辑毫无关系,它的存在仅仅是为了
初始化类sth中的static map对象。所以可以考虑将类init做成类sth的嵌入类。

最后,我们使用static成员的目的无非是两个:
1. 它是一个类固有的属性,在所有实例化的对象中有相同的值。
2. 类似全局变量的用法,和全局变量比好处在于可以由类划分在不同的域(类),这样可以避免全局
变量的混乱。另外,从一个直观的角度也更便于理解和猜测一个在具体问题中变量的含义。


qq120848369 2011-04-16
  • 打赏
  • 举报
回复
#include <iostream>
#include <map>
using namespace std;

class A
{
public:
static map<int,int> m;
};

map<int,int> A::m;

int main()
{
A::m.insert(make_pair(1,2));

return 0;
}


用得着那么纠结么,基础知识。
ttkk_2007 2008-03-21
  • 打赏
  • 举报
回复 3

class A{
static map<int, int> m;
};

map<int, int> A::m = map<int, int>();
夜雨_倚琴 2008-03-21
  • 打赏
  • 举报
回复
你想怎么初试化就怎么初试化。
taodm 2008-03-21
  • 打赏
  • 举报
回复
先定义一个全局生存期的数组,用数组来初始化它。
或者,使用超强的boost::map_list_of
  • 打赏
  • 举报
回复
cpp文件中

classname::map< ... > = map<...>();

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧