0

解決済み: http://pastebin.com/seEaALZh

IDでアイテム情報を取得できるシンプルなアイテムシステムを作成しようとしていました。アイテムIDはランダムと言ってよいので、配列を使用することはできません。宣言された項目を変数として使用したいのですが、その ID で項目情報をすばやく見つけたいと考えています。私が見つけた唯一の方法は stl マップです。

だから私はこの簡単なコードを持っています:

  1. main.h

    #include <iostream>
    #include <map>
    
    enum
    {
        weapon,
        ammo
    };
    
    class c_items
    {
        bool operator()(const c_items& l, const c_items& r) const
        {
            return (l.id < r.id);
        }
    public:
        c_items(void){};
        c_items(int id, char name[], int type);
        char *name;
        int type;
        int id;
    };
    
    extern std::map<int,c_items> Stuff;
    
    c_items::c_items(int id, char name[], int type) : id(id), type(type), name(name)
    {
        Stuff[id] = c_items(id, name, type);
    }
    
    const c_items
        brass_knuckles          (546, "Brass knuckles", weapon),
        golf_club               (2165, "Gold club", weapon);
    
  2. main.cpp

    #include "main.h"
    
    std::map<int,c_items> Stuff;
    
    using namespace std;
    
    int main()
    {
        // cout << Stuff[2165].name.data();
        return 1;
    }
    

そして、何らかの理由でプログラムがクラッシュします。クラスの初期化時にクラスデータをマップに正しく挿入する方法は?

4

2 に答える 2

1

問題は初期化の順序です。brass_knucklesおよびの静的コンストラクターはgolf_club、 の静的コンストラクターの前に最初に実行されるためStuff、まだ構築されていないマップに挿入しようとします。

さらに、ヘッダー ファイルに変数 DEFINITIONS を含める必要はありません。ヘッダー ファイルを複数のソース ファイルに含めると、最終的に複数の定義が作成され、せいぜいリンク エラーが発生するからです。したがって、DEFINITIONS を .h ファイルから .cpp ファイルに移動する必要があります。の定義の後に配置Stuffすると、初期化の問題の順序が修正されます。

他のコンパイル単位で変数を使用する場合は、ヘッダー ファイルに変数の宣言を含めることができます。

extern const c_items brass_knuckles, golf_club;
于 2013-07-13T21:10:12.630 に答える
0

代わりに c_item をそのようなものに入れることはできません

 std::map<int,c_items> Stuff = { {item1.id, item1}, {item2.id, item2}};

ただし、@Chris Dodd によるすべての推奨事項も必要です。

それで

c_items::c_items(int id, char name[], int type) : id(id), type(type), name(name)
{}

extern const c_items  brass_knuckles,      golf_club;

そしてmain.cppで

 const c_items  brass_knuckles = {546, "Brass knuckles", weapon);
    const c_items golf_club = (2165, "Gold club", weapon);
    std::map<int,c_items> Stuff = { {brass_knuckles.id, brass_knuckles}, etc....};
于 2013-07-13T21:18:04.480 に答える