2016-04-07 4 views
0

Class World ist entworfen, um Akteure zu spawnen.
Schauspieler können verschiedene Arten sein: es kann Katze sein, kann Hund sein, kann Baum sein, alles, die einzige ähnliche Sache ist, dass sie alle vom Schauspieler abgeleitet sind.
Und es gibt auch eine Befehlszeile, es gibt World eine Zeichenfolge, wo die nächsten Dinge geschrieben:
what_to_do string_leftover. Wenn "what_to_do" gleich "Spawn" ist, muss das erste Wort von "string_leftover" den Namen "type" und den Namen "actor" haben.
Das Problem ist, dass die Anzahl der Akteure kann unbestimmt sein - ich bin nicht wirklich sicher über ihre Zählung und ich habe wirklich Angst vor vergessen, ihre Spawn-Überladung manuell zu schreiben.Spawn bestimmter Typ von String

Wenn sehr einfach:
Ich eingegeben in der Konsole: "SelectWorld World1" dann "Spawn PhysicalPendulum OneMorePendulum". Dies wird die Welt namens World1 auswählen (das funktioniert perfekt) und den Actor vom Typ PhysicalPendulum mit dem Namen OneMorePendulum spawnen.
Problem: Ich kann nicht elegant bestimmen, welchen Typ ich von der Schnur spawnen sollte.
Warum:
Alle Lösungen, die ich kenne, erfordert, um "String zu Typ Determiners" nicht in Aktor-abgeleiteten Klasse Header/Objekt-Datei zu erstellen.
Ich meine, ich kann wechseln (Zeiger-Funktion-Karte), aber jedes Mal, wenn ich neue Akteur Typ ich muss zu dieser Spawn-Funktion zurückkehren und neue Art auf Spawnables schreiben, gibt es eine geringe Chance, dass ich total kann vergesst es und eine laaaaaaaaaue Zeit des Debuggens wird mich erwarten.
Ich kann statische Klasseninstanz mit Makro erstellen, aber es gibt keine Garantie, dass Spawner erstellt wird, bevor diese Instanz initialisiert wird.
Ich habe über Tricks mit Makros nachgedacht, aber sie können nicht erweitert werden, als ob defined "definition_body" hätte Ich kann "another_definition_body" nicht hinzufügen und bekomme "definition_body another_definition_body".
Wie kann ich Typ von Schnur elegant spawn?

+1

Was meinst du _ "spawn" _? Suchst du eigentlich ein Factory Design Pattern? –

Antwort

0

Deklarieren Sie eine globale Funktion/Makros, die neue Klasse "registrieren" neu zu der Liste von bekannten z.

//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++ erlaubt statische Funktion überall auszuführen ... Ich wusste das nicht. Die letzte Zeile des Codes ist ein Punkt. –

+0

Nicht überall. Die statische Memberfunktion benötigt keine Instanz der Klasse, die aufgerufen werden soll – teivaz

0

Damit Ihr Code ein Objekt erstellen kann, müssen Sie den Typ des Objekts kennen, das Sie erstellen. An einem bestimmten Punkt müssen Sie sagen thing* = new Thing() Sie können eine Fabrik haben, die alle Arten von Objekten kennt, die erstellt werden dürfen. Wenn Sie eine standardisierte Namenskonvention verwenden, können Sie Token einfügen. thing* = new Thing ## string_name. d.h. string = "Roboter". #define ABC (Name) gibt einen neuen Thing ## Namen zurück. Klasse ThingRobot {}; etc ...

+0

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