我有一个查询,我有一组包含列名和本机数据类型的平面文件(比如file1,file2等)。 (如何存储值并且可以在c ++中读取是基本的) 例如。平面文件file1可能包含数据 col1_name = id,col1_type = integer,col2_name = Name,col2_type = string等。
因此,对于每个平面文件,我需要创建C ++数据结构(即1个平面文件= 1个数据结构),其中成员变量名称与列名称相同,其数据类型将是C ++本机数据类型,如int,根据平面文件中的列类型浮点数,字符串等。 从上面例如:我的平面文件1应该给我下面的声明
class file1{
int id;
string Name;
};
有没有办法可以用C ++编写代码,其中二进制文件一旦创建就会读取平面文件并根据文件创建数据结构(类名与平面文件名相同)。使用这些平面文件创建的所有类都具有getter和setter成员函数的通用功能。
如果您之前做过类似事情或对此有任何想法,请告诉我。
答案 0 :(得分:8)
不,不是直接的。 C ++是一种编译语言。每个类的代码都是由编译器创建的。
您需要两个步骤。首先,编写一个程序来读取这些文件并将它们转换为.cpp文件。其次,将这些.cpp文件传递给编译器。
答案 1 :(得分:8)
不,不容易(请参阅the other answers了解原因。
我建议您查看Python来解决此类问题。 Python's type system结合其使用try
/ except
的精神,更容易解决数据解析的挑战。
如果您真的必须使用C ++,那么您可以使用dynamic properties Qt类的QObject功能找到一个解决方案,并结合QVariant类。虽然这可以达到你想要的效果,但我会添加一个警告,这会让你的任务变得更加沉重,并且可能使你的任务过于复杂。
答案 2 :(得分:5)
C ++类是纯粹的编译时概念,在运行时没有任何意义,因此无法创建它们。但是,你可以选择
std::vector<std::string> fields;
并在您的访问者函数中根据需要进行解析。
答案 3 :(得分:4)
不,但据我所知,您必须能够存储多列的名称。您可以做的是拥有一个成员变量map
或unordered_map
,您可以使用字符串(列的名称)进行索引,然后获取一些数据(如列对象或其他内容)。这样你可以做到
obj.Columns["Name"]
答案 4 :(得分:0)
我不确定是否有这样的设计模式,但如果您的可能类型名称列表是有限的,并且在编译时已知,则无法在运行之前在程序中声明所有这些类,然后只是实例化它们基于文件中的数据?
答案 5 :(得分:0)
您真正想要的是一个字段,其确切性质在运行时会有所不同。
有几种方法,包括Boost.Any
,但由于C ++类型系统的静态特性,实际上只建议2,并且两者都需要事先了解可能需要的所有可能的数据类型。
第一种方法很典型:
Object
基本类型Int
,String
,Date
无论派生类型和多态性的使用。
第二个需要一点Boost魔法:boost::variant<int, std::string, date>
。
一旦覆盖了“变体”部分,您需要实施访问以区分不同的可能类型。传统的面向对象方法的典型访问者,或者只是boost::static_visitor<>
和boost::apply_visitor
组合用于提升方法。
这很简单。