0

C++ プログラムをコンパイルするとエラーは発生しませんが、unordered_map 内でハッシュ関数が失敗し、0 で変更しようとします (stl の hashtable_policy.h の 345 行目)。

修正を見つけましたが、そもそもなぜ問題が発生しているのかわかりません。私の構造体は次のようになります (特定のコードで申し訳ありません)。

struct Player {
private:
    Entity& entity = entityManager->create();
public:
    Player() {
        entity.addComponent(new PositionComponent(0, 0)); // Add component uses the unordered map.
    }
};
Player playerOne; // Error perpetuates through constructor.

ただし、playerOne をポインターとして宣言すると、次のようになります。

Player* playerOne;

そして、次のように呼び出します。

playerOne = new Player();

問題はありません。

私は検索してきました-成功しませんでした。私は何が間違っているのでしょうか?

4

1 に答える 1

7

Player をグローバルとして使用する場合、entityManager (おそらく別のグローバル) がまだ初期化されているかどうかわかりません。グローバルの初期化の順序は定義されていません。

ポインターを使用して初期化するとnew(おそらく main() で)、それまでにすべてのグローバルが作成されているため、コードは機能します。

これは、グローバル変数が悪い考えである理由の 1 つを強調しています。

于 2013-07-17T13:56:27.047 に答える