C++,在运行时创建类
C++, creating classes in runtime
我有一个查询,我有一组包含列名和本机数据类型的平面文件(比如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;
并根据需要在访问器函数中进行解析。
没有,但据我所知,您必须能够存储多个列的名称。您可以做的是拥有一个成员变量map
或unordered_map
,您可以使用字符串(列的名称)对其进行索引,并获取一些数据(如列对象或其他东西)。这样你就可以进行
obj.Columns["Name"]
我不确定这是否有设计模式,但如果你的可能类型名称列表是有限的,并且在编译时是已知的,你不能在运行之前在程序中声明所有这些类,然后根据文件中的数据实例化它们吗?
您实际想要的是一个字段,它的确切性质在运行时会有所不同。
有几种方法,包括Boost.Any
,但由于C++类型系统的静态性质,真正推荐的方法只有2种,而且两者都需要事先了解可能需要的所有可能的数据类型。
第一种方法是典型的:
Object
基类型Int
、String
、Date
任何派生类型
以及多态性的使用。
第二个需要一点助推魔法:boost::variant<int, std::string, date>
。
一旦涵盖了"变体"部分,就需要实现访问,以区分不同的可能类型。传统面向对象方法的典型访问者,或者简单地针对boost方法的boost::static_visitor<>
和boost::apply_visitor
组合。
这相当简单。
- 在 c++ 中是否允许创建具有运行时边界的数组?
- cout 新创建的对象引发运行时错误
- 创建 QtChart 对象会在运行时创建EXC_BAD_ACCESS错误
- 在编译时而不是运行时创建一个由两个字节组成的值
- 如何在运行时创建和命名对象?
- 如何在运行时对程序创建的.sys文件设置文件版本
- 在函数中创建的数组,编译时还是运行时?
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 在运行时创建和更改游戏状态
- 在运行时创建 DFA.多少个州
- 将事件分配给在运行时动态创建的 VCL 控件
- 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C 构建器]
- 在 OpenGL ES for Android 中运行时创建大型纹理的最有效方法
- 根据用户的输入在运行时创建对象
- 在运行时用c++创建dll
- 从SFML提供的X11句柄创建Irrlicht设备.运行时X11/OOpenGL错误
- 如何在游戏运行时创建新函数并执行它
- 使用类型擦除创建运行时type_traits查询
- 如何从C/ c++项目中创建运行时组件