2010-11-25 10 views
0

私の目標は、実行時にクラスの文字列名を指定し、そのクラスのインスタンスを順番に返すシステムを作成することです。 私は現在、私はそれが適切にコンパイルすることができないけれども、私は達成しようとしているものを正確に行うように見える例を見つけた。以下は、そのコードに基づいている:ファクトリパターンを修正して、これらのコンパイルエラーを根絶するにはどうすればよいですか?

//LevelObject.h  
#pragma once 

#include <map> 
#include <string> 

class LevelObject 
{ 
    protected: 
     int ID; 

    public: 
     template<class T> static LevelObject* createT(void) 
     { 
      return new T(0); 
     } 

     LevelObject(void); 
     ~LevelObject(void); 
}; 

struct BaseFactory 
{ 
    typedef std::map<std::string, LevelObject*(*)()> map_type; 

    static LevelObject* createInstance(const std::string& s) 
    { 
     map_type::iterator it = getMap()->find(s); 
     if(it == getMap()->end()) 
     { 
      return 0; 
     } 
     return it->second(); 
    } 

    private: 
     static map_type* objectMap; 

    protected: 
     static map_type* getMap() 
     { 
      if(!objectMap) 
      { 
       objectMap= new map_type; 
      } 
      return objectMap; 
     } 
}; 

template<class T> 
struct DerivedRegister : BaseFactory 
{ 
    DerivedRegister(const std::string& s) 
    { 
     getMap()->insert(std::make_pair(s, &LevelObject::createT<T>)); 
    } 
}; 


//Item.h 
#pragma once 

#include "LevelObject.h" 

class Item : 
    public LevelObject 
{ 
    int ID; 
    static DerivedRegister<Item> reg; 

public: 
    Item(int id); 
    ~Item(void); 
}; 


//Item.cpp 
#include "Item.h" 

Item::Item(int id) 
{ 
    ID = id; 
} 

Item::~Item(void) 
{ 
} 

DerivedRegister<Item> Item::reg("item"); 

論理派生オブジェクト、すなわちアイテムは、それ自体のインスタンスを返す関数に文字列と参照を登録することです。 createInstanceを呼び出すと、ユーザーが入力した文字列が取り込まれ、マップを使用して返すオブジェクトが決定されます。

残念ながら、このコードは正しくコンパイルし、私に次のエラーを与えていない。

エラー1つのエラーC2752: 'のstd :: tr1を:: _ Remove_reference < _Ty>': 部分的に複数の専門 は、テンプレート引数リストに

エラー2エラーC2528と一致した: '抽象 宣言子':参照するポインタが 違法はC:\プログラムファイルは、Microsoft Visual Studioの を\ 10.0 \ VCの\ 965

エラー3エラーC2528 type_traits \含ま: 'タイプ':参照するポインタ が違法Cです:マイクロソフトのVisual Studio 10.0 \ VCの\ \ \プログラム ファイル349

type_traits \含ま

誰かがこれらのエラーをスムーズにするのに役立つ場合は、私は非常に感謝します。 または、おそらく私は最初は完全に間違っていると思うので、誰かが私が別の方向に進むべきであると感じたら、私に知らせてください。

ありがとうございます。

+0

変数名マップを別のものに変更してください。コードを読んでいるうちに混乱します。 –

答えて

0

IはLevelObjectクラスのコンストラクタとデストラクタに、空のボディを追加し:そして

LevelObject(void) { } 
~LevelObject(void) { } 

BaeFactoryクラスの静的mapメンバー変数を宣言:

BaseFactory::map_type* BaseFactory::map; 

との両方でエラーなくコンパイルされたコードGCCとVisual Studio。

+0

すぐにお返事いただきありがとうございますが、これらの調整を行っても、私はまだそれをコンパイルすることはできません。 – Brandon

+0

私は、私が投稿したコードの最後の行がなければ、すべてがうまくコンパイルされることに気付きました。すべてをテストするときにその行をコピーしてもよろしいですか? – Brandon

1

この質問が投稿されて以来、長いことがありましたが、回答がなく、私もここでうんざりしました。追加すると思いました。私は(StackOverflowの答えhereから)同じ工場コードをコピーし、同じ問題がありました。私は解決策を見つけたthis StackOverflow答え。

それはstd::make_pairに問題があります。使用していると思われるVisual Studio 2010が判明しました。代わりにstd::pair<std::string,LevelObject*(*)()>を使用してください。あなたはうまくいくでしょう。少なくとも私にとってはまったく同じ問題を解決しました。

+0

これを投稿していただきありがとうございます、私は同じ問題がありました。これで最初のエラーが修正されました。現在、未解決の外部:private:staticクラスstd :: map 、class std :: allocator >文字列が続く。なぜどんなアイデア?これらのテンプレートは私を混乱させ、特にコンパイルエラーを混乱させます:S –

+0

2番目のエラーは完全なメッセージ、コードサンプルなどを使わずに診断してみるのは本当に難しいようです。私の提案は、だからそれについての質問。あなたが知っている人は、同じ問題を抱える最初の人ではないかもしれません。 – daveaglick

+0

返事をありがとう、それは工場の地図コレクションに関する未解決の外部でした。 CBaseFactory :: map_typeを追加して修正しました。* CBaseFactory :: map = new map_type(); base.cppに –

関連する問題