C++ 如何初始化类';值为结构的私有成员静态映射?
我有一个类,其私有成员是静态映射:C++ 如何初始化类';值为结构的私有成员静态映射?,c++,data-structures,map,static,C++,Data Structures,Map,Static,我有一个类,其私有成员是静态映射: Class Devices { ... private: struct DevicePair { int nCtr; bool isToAdd; }; DevicePair m_DevPair; static map <string, DevicePair> m_SYSdeviceMap; }; 类设备 { ... 私人: 结构设备空气 { 国
Class Devices
{
...
private:
struct DevicePair
{
int nCtr;
bool isToAdd;
};
DevicePair m_DevPair;
static map <string, DevicePair> m_SYSdeviceMap;
};
类设备
{
...
私人:
结构设备空气
{
国际非关税贸易关系;
布尔伊斯托加;
};
DevicePair m_DevPair;
静态映射m_SYSdeviceMap;
};
为什么我不能在cpp文件中这样做
map <string, DevicePair> Devices::m_SYSdeviceMap;
映射设备::m_SYSdeviceMap;
如何在cpp文件中初始化它?使用以下行:
map<string, Devices::DevicePair> Devices::m_SYSdeviceMap;
映射设备::m_SYSdeviceMap;
另外,作为一种良好的编码实践,使用名称空间std删除
您不能使用您所说的声明,因为它不知道DeviceAir
在该范围内,您必须是设备::
私有静态通常是一个坏主意。顺便说一下,您最好将此实例隐藏在.cpp文件的“匿名命名空间”部分,在该部分中,编译单元中的函数(通常是类成员)可以看到它,但外部文件看不到它
原因是它是一个向类的所有用户公开的实现细节
在您的情况下,这将很难做到,因为DevicePair
在您的类中是私有的,您不能简单地移动它,因为m_DevPair的标题中需要它
当然,如果您需要类是线程安全的,那么您需要一个互斥体等来控制对映射的访问(除非它在一个线程中初始化,然后仅由多个线程读取)。互斥锁当然会在匿名名称空间中(而且几乎肯定应该是)
不过,我还是会重新考虑您的设计。为什么我们要避免使用“使用命名空间std”?:D@Owen因为它用许多可能不需要的类型和方法污染了全局名称空间。