2012-04-17 4 views
4

私は、そのプライベートメンバ静的なマップであるクラスを持っている:クラスのprivateメンバー静的マップを初期化するには、値が構造体である必要がありますか?

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ファイルでどのように初期化しますか? - std::map

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

また、良いコーディングプラクティスとして、あなたのヘッダからusing namespace std;を削除し、マップの使用を修飾:この行では

答えて

3

あなたはそれが DevicePairがその範囲にあるものを知っていないので、あなたが Devices::

それ以前にプライベート静は仕方によって、通常は悪いアイデアですしなければならない、あなたは通常、優れていると述べている宣言を使用することはできません
+0

"using namespace std"を使用しないのはなぜですか? :D – Owen

+0

@Owenなぜなら、大量の望ましくない型やメソッドを使ってグローバル名前空間を汚染するからです。 –

+0

ああ...私はそれを得る...ありがとう! – Owen

2

このインスタンスを.cppファイルの "匿名の名前空間"セクションに隠しておくと、コンパイル単位(通常はクラスメンバ)内の関数には表示されますが、外部ファイルには表示されません。

理由は、クラスのすべてのユーザーに公開する実装の詳細です。

DevicePairはあなたのクラスではプライベートであるため、難しくなります。m_DevPairのヘッダーに必要であるため、単純に移動することはできません。

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

私はまだあなたのデザインを考え直しています。

関連する問題