2

次のように、ヘッダー ファイルで静的な順序付けされていないマップを宣言しました。

static boost::unordered_map<KeyAction, sf::Key::Code> WindowKeyMap;

その同じヘッダー ファイルに、マップをいくつかの値で埋める関数があります。

static void Initialize(std::string &file)
{
    WindowKeyMap[MoveLeft] = sf::Key::Code::Left;
    WindowKeyMap[MoveRight] = sf::Key::Code::Right;
    WindowKeyMap[MoveUp] = sf::Key::Code::Up;
    WindowKeyMap[MoveDown] = sf::Key::Code::Down;
    std::cout << std::endl << WindowKeyMap.size() << std::endl;
}

後で私のプログラムで、別のクラス/関数内で、値の1つを読み取ろうとします:

std::cout << std::endl << WindowKeyMap.size() << std::endl;
auto test2 = WindowKeyMap[MoveRight];

しかし、マップは常に空です。コンソールへの出力は、初期化ルーチンから常に 4 になり、2 番目の cout からは 0 になります。静的マップはプログラム全体で永続的だと思っていたので、静的マップがどのように空になるかについて少し混乱しています。誰でも光を当てることができますか?

ありがとう

4

2 に答える 2

9

各コンパイル単位 (*.cpp) が独自のローカル静的コピーを取得するように、ヘッダーで変数を宣言すると。あなたはそれを宣言しなければなりませんextern

extern boost::unordered_map<KeyAction, sf::Key::Code> WindowKeyMap;

そして1つのcppで

boost::unordered_map<KeyAction, sf::Key::Code> WindowKeyMap;
于 2011-03-26T09:26:45.807 に答える
1

シンプル:やらないでください。@Eelke で提案されているように、初期化とスコープを取り除くことができますが、長期的には自分自身を撃つことになります...誰もがどこからでもハッシュテーブルにアクセスできるようにしたいですか? (明らかに重要な) データへの制御不能なアクセスのリスクを本当に受け入れますか? アプリケーション全体でテスト不可能なグローバル状態を本当に望んでいますか? <unordered_map>プログラムの多くの翻訳単位にプルすることによって導入されたすべての依存関係を本当に持ちたいですか? しばらくはこのまま続けることもできますが、要点は、ロジックとデータをクラスにラップし、インターフェイスを介してサービスを提供することです。ファクトリまたは依存関係コンテナーを介してインターフェイスのインスタンスを作成し、そのオブジェクトの有効期間を明示的に管理します。

よろしく、

ポール

于 2011-03-26T09:43:55.917 に答える