C++ C++;,在运行时创建类

C++ C++;,在运行时创建类,c++,C++,我有一个查询,我有一组包含列名和本机数据类型的平面文件(比如file1、file2等)。(如何存储和读取C++的值是基本的) 平面文件文件1可能有如下数据 col1\u name=id、col1\u type=integer、col2\u name=name、col2\u type=string等等 对于每个平面文件,我需要创建C++数据结构(即1个平面文件=1个数据结构),其中成员变量名与列名相同,并且其数据类型将是int型、浮点数、字符串等C++原生数据类型,根据平面文件中的列类型。 我的平

我有一个查询,我有一组包含列名和本机数据类型的平面文件(比如file1、file2等)。(如何存储和读取C++的值是基本的) 平面文件文件1可能有如下数据 col1\u name=id、col1\u type=integer、col2\u name=name、col2\u type=string等等

对于每个平面文件,我需要创建C++数据结构(即1个平面文件=1个数据结构),其中成员变量名与列名相同,并且其数据类型将是int型、浮点数、字符串等C++原生数据类型,根据平面文件中的列类型。 我的平面文件1应该给我下面的声明

class file1{
  int id;
  string Name;
};

有一种方法可以在C++中编写代码,其中二进制创建后将读取平面文件并根据文件创建数据结构(类名将与平面文件名相同)。使用这些平面文件创建的所有类都具有getter和setter成员函数的公共功能


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

C++类是纯编译时概念,在运行时没有任何意义,因此无法创建它们。不过,你可以随我去

std::vector<std::string> fields;
std::向量场;

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

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

您需要一个两步流程。首先,编写一个程序读取这些文件并将其转换为.cpp文件。第二,将这些.cpp文件传递给编译器。

不,不容易(请参阅原因)

我建议大家看看这类问题。结合其使用
try
/
except
的精神,它更容易接受解析数据的挑战


如果你真的必须使用C++,那么你可以找到一个使用S类的特性和类结合的解决方案。虽然这可以满足您的要求,但我会添加一个警告,即这会变得越来越重,并且可能会使您的任务变得过于复杂。

不,但是从我所知,您必须能够存储多个列的名称。您可以做的是使用成员变量
map
unordered\u map
,您可以使用字符串(列的名称)对其进行索引,并获取一些数据(如列对象或其他内容)。这样你就能做到

obj.Columns["Name"]

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

您实际需要的是一个字段,其确切性质在运行时会发生变化

有多种方法,包括“代码> Boost。任何< /COD>”,但由于C++类型系统的静态特性,只推荐了2种,并且两者都需要预先考虑可能需要的所有可能的数据类型。 第一种方法是典型的:

  • 对象
    基本类型
  • Int
    String
    Date
    任何派生类型
以及多态性的使用

第二个需要一点Boost魔法:
Boost::variant

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


很简单。

不可能,抱歉。你需要使用类似于字符串(属性名称)的映射来代替一个变量数据类型。你不能在C++中运行时创建类定义,你可以使用脚本语言甚至C++来读取这些平面文件,然后吐出源文件并编译它们。我从来没有使用过。这有助于解决“洛奇”的问题吗?我脑子里有一个想法已经有一段时间了。基本上,您不会将类完全集成到软件中,但是您会让软件创建一个(更简单的)新程序,编译它,然后通过运行它继续使用它,这应该是可行的。不过我不是100%确定…@downvoter,能解释一下为什么这没有帮助吗?它非常清楚地说:“请告诉我您是否之前做过类似的事情,或者对此有什么想法。”我也是—我支持您—(+1)@Styne666:我不知道是谁做的以及为什么,但对我来说,这个答案至少缺少一些简短的解释,说明python为什么更好。现在看来,这听起来有点像宠物语言广告。@Plasmah我不提倡最喜欢的语言。然而,很明显,有些语言在某些方面比其他语言做得更好;这是一个很好的例子。我根据这个问题的答案衡量了我答案的细节,但为了让你满意,我添加了一些关于下一步研究方向的指针。@Styne666:+1。这也会让其他对python了解不够的人感到满意。boost::any可能比std::string更好。谢谢你回复我的问题并帮助我。此外,我主要关心的是实现单个二进制文件并将其发送给不同的客户机。客户端提供的平面文件结构会有所不同,因此此二进制文件应该是通用的,可以动态处理数据结构。当然,二进制文件的主要功能与所有客户机类似,只是我们需要满足客户机提供给我们的不同数据,因此这一切都很混乱。我希望我能把我的观点讲清楚。我认为这可能是使用元编程或在C++中的反射。但我对这些概念还是比较陌生的,我认为您应该将这些文本文件作为输入来进行解析。就个人而言,我会使用联合来存储数据。但当然,您必须事先知道文本文件中的预期内容