2016-04-07 20 views
0

クラスワールドはアクターを生成するように設計されています。
アクターは異なるタイプにすることができます:それは猫でも、犬でも、ツリーでも、すべてでも、唯一の類似のものは、すべて俳優から派生したものです。
またコマンドラインもあり、次のものを書いたところでWorldに文字列を与えます:
what_to_do string_leftover。 what_to_doが "Spawn"と等しい場合、string_leftoverの最初の単語はタイプ名、2番目のアクター名でなければなりません。
問題は、Actorsの数が不定になる可能性があることです。実際のカウントについてはわかりませんが、私はSpawnオーバーロードを手動で記述するのを忘れてしまいます。文字列から特定の型を生成する

非常に単純な場合:
私はコンソールに入力しました: "SelectWorld World1"、 "Spawn PhysicalPendulum OneMorePendulum"。 World1という名前の世界が選択されます(これは完全に動作しています)。名前がOneMorePendulumのPhysicalPendulum型のActorを生成します。
問題:文字列から生成する必要がある型をエレガントに決定できません。
理由:
私が知っているすべての解決策は、アクター派生クラスのヘッダー/オブジェクトファイルにない「文字列型決定子」を作成する必要があります。
私はswitch(pointer-to-functionマップ)を使うことができますが、新しいActor型を作成するたびに、そのSpawn関数に戻り、新しい型をスポーンブルに書き留める必要があります。それを忘れて、デバッグの時間が待っています。
マクロで静的クラスインスタンスを作成できますが、このインスタンスを初期化する前にSpawnerが作成されるという保証はありません。
私はマクロを使ってトリックを考えましたが、特定の定義に "definition_body"があった場合、 "another_definition_body"を追加して "definition_body another_definition_body"を取得できないように、拡張することはできません。
文字列から型をエレガントに生成できますか?

+1

_「スポーン」_を意味しますか?ファクトリーデザインパターンを実際に探していますか? –

答えて

0

新しく作成されたクラスを既知のリストに '登録'するグローバル関数/マクロを宣言します。

//SpawnActor.h 
#pragma once 
using std::string; 
using std::map; 
using std::function; 
class Actor; 

class ActorSpawner 
{ 
public: 
    typedef function<Actor()> SpawnFunction; 
    static void RegisterActorClass(const string& name, const SpawnFunction& function) 
    { 
     s_spawnClasses[name] = function; 
    } 

    void SpawnClass(const string& name) 
    { 
     // You'll need to validate name 
     Actor* a = s_spawnClasses[name](); 
     //... 
    } 

private: 
    static map<string, function<Actor()> s_spawnClasses 
}; 


//SpawnActor.cpp 
#include "SpawnActor.h" 
map<string, function<Actor()> SpawnFunction::s_spawnClasses(); 


//TreeActor.h 

class TreeActor : public Actor 
{ 
    ... 
}; 


//TreeActor.cpp 
#include "TreeActor.h" 

ActorSpawner::RegisterActorClass("TreeActor", [](){return new TreeActor();}) 
+0

C++ではどこでも静的関数を実行できます...私はそれを知りませんでした。 コードの最後の行がポイントです。 –

+0

どこにもありません。静的メンバー関数は、呼び出されるクラスのインスタンスを必要としません – teivaz

0

オブジェクトを作成するコードでは、作成するオブジェクトの種類を知る必要があります。ある時点で、thing* = new Thing() と言う必要があります。作成できるオブジェクトの種類をすべて知っているファクトリを持つことができます。標準化された命名規則を使用する場合は、トークンペーストを使用できます。 thing* = new Thing ## string_name。すなわち文字列=「ロボット」。 #define ABC(name)は新しいThing ## nameを返します。クラスThingRobot {};

+0

http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application – dgsomerton

関連する問題