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 のヘッダーで必要になるため、単純に移動することはできません。

もちろん、クラスをスレッドセーフにする必要がある場合は、マップへのアクセスを制御するためにミューテックスなどが必要です (すべてが 1 つのスレッドで初期化され、複数のスレッドによってのみ読み取られる場合を除きます)。もちろん、ミューテックスは匿名の名前空間にあるはずです(ほぼ確実にあるはずです)。

私はまだあなたのデザインを再考します。

于 2012-04-17T07:52:53.170 に答える