gpt4 book ai didi

c++ - 根据文本文件中提供的类名创建对象?

转载 作者:太空狗 更新时间:2023-10-29 20:00:44 26 4
gpt4 key购买 nike

我想知道,在 C++ 中是否可以使用从文件中读取的文本值来创建具有该名称的类的对象,例如。

contents of file: "MyClass"
code: read file
code: instantiate "MyClass" object.

如果可能的话,我想避免一系列硬编码的 if/then/elses。抱歉,我不确定如何用更专业的术语来描述这个问题!

最佳答案

只要您不介意一些限制,这很容易做到。完成这项工作的最简单方法将您限制为从一个公共(public)基类派生的类。在这种情况下,您可以这样做:

// warning: I've done this before, but none of this code is tested. The idea 
// of the code works, but this probably has at least a few typos and such.
struct functor_base {
virtual bool operator()() = 0;
};

然后您显然需要从该基派生的一些具体类:

struct eval_x : functor_base { 
virtual bool operator()() { std::cout << "eval_x"; }
};

struct eval_y : functor_base {
virtual bool operator()() { std::cout << "eval_y"; }
};

然后我们需要一些方法来创建每种类型的对象:

functor_base *create_eval_x() { return new eval_x; }
functor_base *create_eval_y() { return new eval_y; }

最后,我们需要一个从名称到工厂函数的映射:

// the second template parameter is:
// pointer to function returning `functor_base *` and taking no parameters.
std::map<std::string, functor_base *(*)()> name_mapper;

name_mapper["eval_x"] = create_eval_x;
name_mapper["eval_y"] = create_eval_y;

这(终于!)给了我们足够的东西,所以我们可以从一个名称映射到一个函数对象:

char *name = "eval_x";

// the map holds pointers to functions, so we need to invoke what it returns
// to get a pointer to a functor:
functor_base *b = name_mapper.find(name)();

// now we can execute the functor:
(*b)();

// since the object was created dynamically, we need to delete it when we're done:
delete b;

当然,一般主题有很多变体。例如,您可以静态创建每个对象的实例,而不是动态创建对象的工厂函数,只需将静态对象的地址放在映射中。

关于c++ - 根据文本文件中提供的类名创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com