私の目標は、実行時にクラスの文字列名を指定し、そのクラスのインスタンスを順番に返すシステムを作成することです。 私は現在、私はそれが適切にコンパイルすることができないけれども、私は達成しようとしているものを正確に行うように見える例を見つけた。以下は、そのコードに基づいている:ファクトリパターンを修正して、これらのコンパイルエラーを根絶するにはどうすればよいですか?
//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を呼び出すと、ユーザーが入力した文字列が取り込まれ、マップを使用して返すオブジェクトが決定されます。
残念ながら、このコードは正しくコンパイルし、私に次のエラーを与えていない。
type_traits \含まエラー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
誰かがこれらのエラーをスムーズにするのに役立つ場合は、私は非常に感謝します。 または、おそらく私は最初は完全に間違っていると思うので、誰かが私が別の方向に進むべきであると感じたら、私に知らせてください。
ありがとうございます。
変数名マップを別のものに変更してください。コードを読んでいるうちに混乱します。 –