Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字符串生成特定类型_C++_String_Types - Fatal编程技术网

C++ 从字符串生成特定类型

C++ 从字符串生成特定类型,c++,string,types,C++,String,Types,阶级世界是为了培养演员而设计的。 演员可以是不同的类型:可以是猫,可以是狗,可以是树,所有的一切,唯一相似的是他们都是从演员身上衍生出来的。 还有一个命令行,它给了世界一个字符串,在这个字符串中写下下面的内容: 你要做什么?把剩下的串起来。在这里,若“to”等于“Spawn”,那个么剩余字符串的第一个单词必须是类型名,第二个是演员名。 问题是演员的数量可能是不确定的——我真的不确定他们的数量,我真的很害怕忘记手动编写他们的繁殖重载 如果非常简单: 我在控制台中输入:选择World World1,

阶级世界是为了培养演员而设计的。 演员可以是不同的类型:可以是猫,可以是狗,可以是树,所有的一切,唯一相似的是他们都是从演员身上衍生出来的。 还有一个命令行,它给了世界一个字符串,在这个字符串中写下下面的内容: 你要做什么?把剩下的串起来。在这里,若“to”等于“Spawn”,那个么剩余字符串的第一个单词必须是类型名,第二个是演员名。 问题是演员的数量可能是不确定的——我真的不确定他们的数量,我真的很害怕忘记手动编写他们的繁殖重载

如果非常简单: 我在控制台中输入:选择World World1,然后再生成一个或多个物理钟摆。这将选择名为World1的世界,这是完美的工作,并产生名为OneMoreCompeng的Physical钟摆类型的演员。 问题:我无法优雅地确定应该从字符串生成什么类型。 为什么? 我知道的所有解决方案都需要创建字符串到类型限定符,而不是在actor派生的类头/对象文件中。 我的意思是,我可以使用开关指针指向函数映射,但每次我创建新的参与者类型时,我都需要返回到该Spawn函数并将新类型写入spawnables,有一点可能我会完全忘记它,调试的时间会很长。 我可以用宏创建静态类实例,但不能保证在该实例初始化之前创建生成程序。 我考虑过使用宏的技巧,但它们不能被扩展,比如如果某个define有definition\u body,我就不能向其中添加另一个definition\u body,然后将definition\u body添加到另一个definition\u body。
如何从字符串中优雅地生成类型?

对于创建对象的代码,您必须知道要创建的对象的类型。在某个时刻,你必须说新的东西
您可以拥有一个工厂,它知道允许创建的所有对象类型。如果使用标准化命名约定,则可以使用标记粘贴。事物*=新事物字符串\名称。i、 字符串=机器人。定义ABCname返回新事物名称。类ThingRobot{};等等。

声明一个全局函数/宏,将新创建的类“注册”到已知类列表中,例如

//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();})

你说的繁殖是什么意思?您是否正在寻找工厂设计模式?C++允许在任何地方执行静态功能…我不知道。代码的最后一行是一个点,不是到处都是。静态成员函数不要求调用类的实例