【问题标题】:how do i initialize a class' private member static map whose value is a struct?我如何初始化一个值为结构的类的私有成员静态映射?
【发布时间】:2012-04-17 07:41:13
【问题描述】:

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

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

【问题讨论】:

    标签: c++ data-structures map static


    【解决方案1】:

    用这一行:

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

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

    【讨论】:

    • 我们为什么要避免使用“using namespace std”? :D
    • @Owen 因为它用许多可能不需要的类型和方法污染了全局命名空间。
    【解决方案2】:

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

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

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

    在您的情况下,这将很难做到,因为 DevicePair 在您的班级中是私有的,您不能简单地移动它,因为 m_DevPair 的标头中需要它。

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

    不过我还是会重新考虑你的设计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2019-06-26
      • 1970-01-01
      相关资源
      最近更新 更多