Class World旨在产生Actors
演员可以是不同的类型:它可以是Cat,可以是Dog,可以是Tree,一切,唯一类似的东西是它们都来自Actor。
还有命令行,它给世界一个字符串写下一些东西:
what_to_do string_leftover。如果what_to_do等于“Spawn”,那么string_leftover的第一个单词必须是类型名称,第二个 - 演员名称。
问题是Actors的数量可能是无限的 - 我不确定他们的数量,我真的很害怕忘记手动编写他们的Spawn重载。
如果非常简单:
我进入控制台:“SelectWorld World1”然后“Spawn PhysicalPendulum OneMorePendulum”。这将选择名为World1的世界(这是完美的工作)并产生名称为OneMorePendulum的PhysicalPendulum类型的Actor。
问题:我无法优雅地确定我应该从字符串中产生什么类型
为什么:
我所知道的所有解决方案都需要创建“字符串到类型确定器”而不是在actor派生类头/目标文件中
我的意思是我可以使用switch(指向函数的映射),但每次我创建新的Actor类型时我都需要返回到Spawn函数并将新类型写入spawnables,我可能会完全忘记它和looooooong的调试时间将等待我
我可以使用宏创建静态类实例,但不能保证在此实例初始化之前将创建Spawner
我考虑过使用宏的技巧,但它们无法扩展,就像某些定义有“definition_body”一样,我不能在其中添加“another_definition_body”并获得“definition_body another_definition_body”。
我怎样才能从字符串中优雅地生成类型?
答案 0 :(得分:0)
要创建对象的代码,您必须知道要创建的对象的类型。在某些时候你必须说thing* = new Thing()
您可以拥有一个知道允许创建的所有对象类型的工厂。如果使用标准化命名约定,则可以使用标记粘贴。 thing* = new Thing ## string_name
。即string =" Robot"。 #define ABC(name)返回新的Thing ##名称。 class ThingRobot {};等...
答案 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();})