4

我有一个类,其私有成员是静态映射:

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 文件中初始化它?

4

2 回答 2

3

有了这条线:

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

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

于 2012-04-17T07:42:29.007 回答
2

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

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

原因是它是您向类的所有用户公开的实现细节。

在您的情况下,这DevicePair在您的班级中是私有的,并且您不能简单地移动它,因为它在 m_DevPair 的标头中是必需的。

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

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

于 2012-04-17T07:52:53.170 回答