2012-06-28 15 views
6

static mapprivateデータメンバーです。最初のコンテナが空であるように、実装ファイルでそれをどのように初期化するのですか? constではありません。このコンテナには何も入っていないことが重要です。空のプライベートマップを初期化する

std::map<T,T2> YourClass::YourMember = std::map<T,T2>(); 

答えて

7

ヘッダー:

class XXX { 
private: 
    static std::map<X,Y> the_map; // declares static member 
// ... 

実装ファイル:

std::map<X,Y> XXX::the_map; // defines static member 

マップのコンストラクタの呼び出しを挿入します。この(私が正しくあなたを理解している場合)について

+0

私のマップはプライベートなので、CCファイルの上部にあるデフォルトの初期化は無効です。 –

+0

コードを投稿すると、あなたはどこかで間違いをしています。 –

+0

私はtypedefを公開する必要がありましたが、メンバーを非公開にしました。それはそれを修正した。 –

5

方法あなたのプログラムの初期化コード(およびクリーンアップのデストラクタ)に追加します。しかし、注意してください - 異なる翻訳単位の間のこのような静的コンストラクタの順序は定義されていません。

+0

または単に 'std :: map YourClass :: YourMember; –

+0

@MikeSeymour:まさに。必要に応じてコンストラクタの引数を与えることができることを明確にします。 – Linuxios

3

あなたはクラス定義で定義する場合は、あなたが実装でそれを宣言する必要があります。

--- test.h ---

// includes and stuff... 
class SomeClass 
{ 
    private: 
     static std::map<int,std::string> myMap; 
}; 

--- test.cpp ---

std::map<int,std::string> SomeClass::myMap; // <-- initialize with the map's default c'tor 

あなたも、初期設定を使用することができます:

std::map<int,std::string> SomeClass::myMap = std::map<int,std::string>(myComparator); 
+0

Nitpick:これはクラス内で/ declared /となり、実装では/ defined /となります。 – Grault