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

2023-12-10

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

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

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


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

// 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;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据文本文件中提供的类名创建对象? 的相关文章

随机推荐

  • 在线性时间和常量空间中查找数组中缺失和重复的元素

    给你一个数组N64 位整数 N可能非常大 您知道每个整数 1 N 在数组中都会出现一次 除了有一个整数缺失和一个整数重复 编写一个线性时间算法来查找丢失和重复的数字 此外 您的算法应该在较小的恒定空间中运行 并且保持数组不变 Source
  • 如何使用 ggplot2 在一组美国县周围创建边界?

    我对使用 R 比较陌生 我正在尝试使用数据来创建美国各州的地图 以勾勒出某些区域的轮廓并为其着色 我正在尝试用黑色显示一个州及其县 除此之外 我想在县组周围创建粗红色边框 并根据我拥有的一些数据对一些县进行颜色填充 本质上我想结合这两个图像
  • 使用授权过滤器区分控制器操作

    我想要 4 个具有相同名称的操作 控制器方法可能有不同的名称 但它们的名称相同 ActionName 它们的属性对于所有 4 个都是相同的 ActionName Same name public ActionResult AnonActio
  • Swift:表视图超类错误

    我使用 Swift 创建了一个滑出菜单 我之前已经做过很多次了 但是当我今天创建它时 我收到了这个错误 参见屏幕截图 这可能只是我犯的一个简单错误 这是我认为导致问题的代码 override func tableView tableView
  • Laravel 4.2,Artisan::call() 忽略 --env 选项

    我正在构建一个应用程序 需要创建新数据库 执行迁移并通过网页播种数据库数据 我正在尝试使用 Laravel 4 2 中的以下代码来实现此目的 请注意 这是在我设置的控制器内 Artisan call migrate array env gt
  • GWT 动态区域设置

    我想设置gwt locale在 Spring 的帮助下获取用户选择的区域设置LocaleContextHolder public static final String getCurrentLocale return LocaleConte
  • 从 strings.xml 中的数组设置微调器的值

    我有一个微调器 它使用 strings xml 中的数组 如果数组有 5 个字符串 1 2 3 4 5 并且我希望微调器显示第二个 string 2 作为默认值 这可能吗 我知道我可以重新排列字符串顺序 使第一个字符串为 2 但如果旋转对话
  • 用于匹配空格或标点符号和非字母数字的正则表达式

    我有这个正则表达式 s 这与数组中的任何空格或标点符号匹配 但不是所有标点符号 我正在努力寻找与任何标点符号匹配的示例 我考虑过匹配字符不是字母数字的位置 但这会导致重音字母和不同词典的问题 是否有全包标点符号 例如 当我说标点符号时我希望
  • 使用 PyDev 出现错误: at 0x0000000002731828> [重复]

    这个问题在这里已经有答案了 我收到一个简单打印语句的错误 可能的错误是什么 已更改为浮动并尝试过 但错误仍然存 在 if name main print i i for i in range 5 error
  • Laravel 验证规则需要两个字段之一,但两个字段都不应该同时存在

    当需要两个字段中的任何一个但两个字段不应同时存在时 是否有 Laravel 验证规则 例如 手机号码和电子邮件 其中一个应该存在 但不能同时存在 不幸的是 我找不到一个 为了满足您的需求 以下是我采取的步骤 Laravel 对于制作一个的情
  • CommandParameter 与 ListView 命令绑定无关

    我没有成功从 ListView 项目发送 CommandParameter 我的代码如下
  • 第一次机会例外

    我一直在浏览 MSDN 帮助文档来掌握 Visual Basic 尝试使用计时器的示例后 将标签和计时器组件拖到设计器中 并将以下内容添加到组件子例程中 Label1 Text My Computer Clock LocalTime ToL
  • 用于多态/单表继承关联的 Rails 嵌套属性形式

    我正在开发一个表单 使用 SimpleForm 它允许您编辑嵌入的关联 我遇到的问题是嵌套模型是子类 因此它们是不同的类型 具有可能不同的字段 我正在为每种类型的模型创建隐藏表单 并使用 JavaScript 显示所选类型的表单 仅供参考
  • 向 Angular HttpClient 添加 HTTP 标头不会发送标头,为什么?

    这是我的代码 import HttpClient HttpErrorResponse HttpHeaders from angular common http logIn username string password string co
  • 使用 NumPy 将固定调色板应用于图像?

    我有一个 RGB 字节的 NumPy 图像 假设它是这个 2x3 图像 img np array 0 255 0 255 255 255 255 0 255 0 255 255 255 0 255 0 0 0 我还有一个调色板 涵盖图像中使
  • 如何使用JavaScript更新/更改HTML内容并防止页面刷新?

    我是脚本新手 我想用 JavaScript 更新 HTML 内容 但正如你所看到的 网页不断刷新 如何防止页面刷新 JavaScript function showResult form var coba form willbeshown
  • 如何将数组中的数字“加倍”,并将其保存在新数组中

    这是一个两步问题 1 我试图将一个数组 原始数组 的内容 加倍 将其保存在一个新数组 加倍数组 中 2 然后将这两个数组分配给具有 2 个属性的对象 新对象 原始号码 双数 这就是我到目前为止所拥有的 我做错了什么 var numbers
  • 如何使用数据字段获取组合框显示值?

    我已在资源编辑器中将组合框数据设置为 第一 第二 第三 但是当我编译程序时 组合框完全是空的 我根本看不到任何项目 另外 如何设置默认选择哪个项目 如何以编程方式更改当前选定的项目 答案可以在这篇文章中找到 http codeguru ea
  • 以编程方式更改 WPF 按钮背景图像

    我正在尝试创建一个
  • 根据文本文件中提供的类名创建对象?

    我想知道 在 C 中是否可以使用从文件中读取的文本值来创建该名称的类的对象 例如 contents of file MyClass code read file code instantiate MyClass object 如果可能的话