C ++,在运行时创建类

问题描述 投票:6回答:6

我有一个查询,我有一组包含列名和本机数据类型的平面文件(比如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成员函数的通用功能。

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

c++
6个回答
8
投票

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

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


8
投票

不,不容易(请参阅qazxsw poi qazxsw poi qazxsw poi,原因不是)。

我建议看看the而不是这种问题。 other结合其使用answers / Python的精神,更容易解决数据解析的挑战。

如果你真的必须使用C ++,那么你可能会找到一个解决方案,使用Python's type systemtry类的except特性,结合dynamic properties类。虽然这可以达到你想要的效果,但我会添加一个警告,说明这种情况会变得很重,并且可能使你的任务过于复杂。


5
投票

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

Qt

并在您的访问器功能中根据需要进行解析。


4
投票

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

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

0
投票

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


0
投票

你真正想要的是一个字段,它的确切性质在运行时变化。

有几种方法,包括map,但由于C ++类型系统的静态特性,实际上只建议2,并且两者都需要事先了解可能需要的所有可能的数据类型。

第一种方法是典型的:

  • unordered_map基地类型
  • obj.Columns["Name"] Boost.AnyObject无论派生类型

和多态性的使用。

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

一旦覆盖了“变体”部分,就需要实现访问以区分不同的可能类型。传统的面向对象方法的典型访问者或简单的StringDate组合用于提升方法。

这很简单。

© www.soinside.com 2019 - 2024. All rights reserved.