我如何初始化一个类的私有成员静态映射,其值是一个结构?

时间:2012-04-17 07:41:13

标签: c++ data-structures map static

我有一个私有成员是静态地图的类:

Class Devices
{   
    ...
    private:
    struct DevicePair
    {
       int nCtr;
       bool isToAdd;
    };
    DevicePair m_DevPair;
    static map <string, DevicePair> m_SYSdeviceMap;    
};

为什么我不能在cpp文件中执行此操作?

map <string, DevicePair> Devices::m_SYSdeviceMap;

如何在cpp文件中初始化它?

2 个答案:

答案 0 :(得分:3)

这一行:

map<string, Devices::DevicePair> Devices::m_SYSdeviceMap;

此外,作为良好的编码习惯,请从标题中删除using namespace std;,并限定您对地图的使用 - std::map

答案 1 :(得分:2)

您不能使用您所说的声明,因为它不知道该范围内的DevicePair是什么,您必须在Devices::之前

顺便说一句,私有静态通常是一个坏主意,你通常最好将这个实例隐藏在.cpp文件的“匿名命名空间”部分中,在该部分它对编译单元中的函数是可见的(通常是类成员)但不是外部文件。

原因是它是您向班级所有用户公开的实施细节。

在你的情况下很难做到,DevicePair在你的班级是私人的,你不能简单地移动它,因为在m_DevPair的标题中需要它。

当然,如果您需要您的类是线程安全的,您需要一个互斥锁等来控制对映射的访问(除非它在一个线程中初始化然后只由多个线程读取)。互斥体当然会在你的匿名命名空间中(几乎可以肯定)。

我仍然会重新考虑你的设计。