C++,在运行时创建类

C++, creating classes in runtime

本文关键字:创建 运行时 C++      更新时间:2023-10-16

我有一个查询,我有一组包含列名和本机数据类型的平面文件(比如file1、file2等)。(如何在c++中存储和读取值是基本的)例如,平面文件file1可能具有以下数据col1_name=id,col1_type=integer,col2_name=name,col2_type=string等等

因此,对于每个平面文件,我需要创建C++数据结构(即1个平面文件=1个数据结构),其中成员变量名称与列名相同,其数据类型将根据平面文件中的列类型为C++原生数据类型,如int、float、string等。来自上面的例子:我的平面文件1应该给我下面的声明

class file1{
  int id;
  string Name;
};

有没有一种方法可以用C++编写代码,二进制文件一旦创建,就会读取平面文件并基于该文件创建数据结构(类名和平面文件名相同)。使用这些平面文件创建的所有类都将具有getter和setter成员函数的通用功能。

如果你之前也做过类似的事情,或者对此有任何想法,请告诉我。

不,不容易(原因请参阅其他答案)。

对于这类问题,我建议看一下Python。Python的类型系统与其使用try/except的精神相结合,使其更容易应对解析数据的挑战。

如果您真的必须使用C++,那么您可能会找到一个使用Qt的QObject类的动态属性特性并结合QVariant类的解决方案。虽然这可以满足您的需要,但我要添加一个警告,这会变得有点沉重,可能会使您的任务过于复杂。

否,不直接。C++是一种编译语言。每个类的代码都是由编译器创建的。

你需要一个两步走的过程。首先,编写一个程序,读取这些文件并将其转换为.cpp文件。其次,将这些.cpp文件传递给编译器。

C++类是纯编译时概念,在运行时没有任何意义,因此无法创建它们。然而,你可以选择

std::vector<std::string> fields;

并根据需要在访问器函数中进行解析。

没有,但据我所知,您必须能够存储多个列的名称。您可以做的是拥有一个成员变量mapunordered_map,您可以使用字符串(列的名称)对其进行索引,并获取一些数据(如列对象或其他东西)。这样你就可以进行

obj.Columns["Name"]

我不确定这是否有设计模式,但如果你的可能类型名称列表是有限的,并且在编译时是已知的,你不能在运行之前在程序中声明所有这些类,然后根据文件中的数据实例化它们吗?

您实际想要的是一个字段,它的确切性质在运行时会有所不同。

有几种方法,包括Boost.Any,但由于C++类型系统的静态性质,真正推荐的方法只有2种,而且两者都需要事先了解可能需要的所有可能的数据类型。

第一种方法是典型的:

  • Object基类型
  • IntStringDate任何派生类型

以及多态性的使用。

第二个需要一点助推魔法:boost::variant<int, std::string, date>

一旦涵盖了"变体"部分,就需要实现访问,以区分不同的可能类型。传统面向对象方法的典型访问者,或者简单地针对boost方法的boost::static_visitor<>boost::apply_visitor组合。

这相当简单。