2017-10-23 12 views
0

map<string, base*>baseがクラスclass1class2によって派生した静的オブジェクトのマップを作成しようとしています。私のマップは、タイプclass1class2のオブジェクトへのポインタを格納します。 C++は静的オブジェクトのマップを初期化します

いくつかの記事を読んだ後、私はマップを初期化するために、静的なクラスの機能とシングルトンを作成することにより、これを行うことを決めた。

class A { // singleton class 
public: 

static map<string, base*> create_map() { 
map<string,base*> m; 
m["1"]=new class1(); 
m["2"]=new class2(); 
}; 
static const map<string, base*> myMap; 
}; 

int main() {  
const map<string,base*> A::myMap = A::create_map(); 
myMap["1"]->func();  
} 

ただし、これはエラーを与える:myMap is not declared in this scope。誰かがシングルトンの方法と私が間違っていることを説明できますか?ヘッダーファイルが別の場合、これはどのように変更されますか?
TIA。

EDIT: はにコードを変更:

class A { // singleton class 
public: 

static map<string, base*> create_map() { 
map<string,base*> m; 
m["1"]=new class1(); 
m["2"]=new class2(); 
return m; 
}; 
static const map<string, base*> myMap; 
}; 

const map<string,base*> A::myMap = A::create_map(); 
int main() {  

A::myMap["1"]->func();  
} 

これはまだエラーを与える:passing const std::map<std::basic_string<char>, base*> as 'this' discards qualifiers.

+0

の欠けていた:なぜあなたは1が必要なのでしょうか?単にあなたの関数を一度呼び出すだけで(そしてマップへの参照を渡すと)どうでしょうか? – Darhuuk

+0

create_map()はmap を返します。何も返さない...何か不足していますか?ここで 'm'はスタック上で宣言され、' create_maps'スコープの終わりで破棄されます –

+0

また、 'create_map'関数は作成されたマップを返しません。 2.生ポインタを使用しているため、メモリがリークしています。 'std :: unique_ptr'を使うとそれを解決できます。おそらく、プログラムが終了するとリークが発生するので、ここでも悪くないので、OSはそれをクリーンアップします。 – Darhuuk

答えて

0

あなたのクラスの後に行map<string, base*> A::myMap;を追加する必要があります。 また、あなたのマップオブジェクトのconstの宣言を避けるべき、とcreate_map()メソッドは、シングルトンに関してはreturn文

class A { // singleton class 
public: 

    static map<string, base*> create_map() { 
     map<string,base*> m; 
     m["1"] = new class1(); 
     m["2"] = new class2(); 

     return m; 
    } 

    static map<string, base*> myMap; 
}; 

map<string, base*> A::myMap; 

int main() { 
    A::myMap = A::create_map(); 
    A::myMap["1"]->func(); 

    return 0; 
} 
0

MYMAPはAのメンバーである、あなたはそれに応じて対処する必要があります。

A::myMap["1"]->func();  
関連する問題