C++ 在qt C+中从mysql创建动态数据结构+;

C++ 在qt C+中从mysql创建动态数据结构+;,c++,qt,data-structures,dynamic-programming,C++,Qt,Data Structures,Dynamic Programming,我的目标是显示和执行一些计算,比如比较mysql数据库中的数据。mysql数据库包含许多表,每个表中的第一行包含字段的名称,如id、name、PositionX、PositionY、BackgroundColor及其下一行中的值 我需要的是在C++/Qt中创建一个动态数据结构,变量名与字段名相同。这样我就可以根据所选的表存储这些值 因此,当我将问题分成更小的步骤时 1.根据值识别数据类型。 2.生成与mysql表行中的名称相同的变量名称。 3.创建动态结构的步骤 包含字段的mysql表示例 ID

我的目标是显示和执行一些计算,比如比较mysql数据库中的数据。mysql数据库包含许多表,每个表中的第一行包含字段的名称,如id、name、PositionX、PositionY、BackgroundColor及其下一行中的值

我需要的是在C++/Qt中创建一个动态数据结构,变量名与字段名相同。这样我就可以根据所选的表存储这些值

因此,当我将问题分成更小的步骤时
1.根据值识别数据类型。
2.生成与mysql表行中的名称相同的变量名称。
3.创建动态结构的步骤

包含字段的mysql表示例

ID位置X位置Y背景色
0X32 233 256 0x3366

我可以创建一个静态数据结构

struct table
{
int ID,PositionX,PositionY,BackgroundColor;
}mytable;
我可以动态生成这个结构吗

PS:-(我搜索了一些,遇到了一个称为反射的术语,但无法理解,因为我最近(2年)转到了计算机科学,我不知道我是否走在正确的道路上)。
一些示例代码应该比理论对我有更好的帮助。

您需要先理解理论,对不起,否则这些对您来说毫无意义

一个C++编译器执行名称擦除和很多类型擦除。这意味着一旦编译器编译了代码,对象存储就没有名字,而且大部分是无类型的。只有具有虚拟方法的结构类型是已知的,但对其成员一无所知。结构作为概念仅在编译代码时存在。一旦编译完成,这个概念就不复存在了

谈论“动态”结构在C++中是没有意义的,因为在运行时,对象代码对“结构”是什么都不知道。 您不能在运行时重用编译时结构概念,必须设计自己的结构。因为您使用的是Qt,所以可以将运行时生成的结构表示为从名称到变体的映射:

QMap
QVariant
可以存储Qt的元类型系统已知的任何类型,您也可以让该系统知道您可能正在使用的任何自定义类型

您的
表将如下所示,然后:

using DStruct = QMap<QString, QVariant>;

// Create a prototype row
DStruct myTable;
myTable.insert("ID", QVariant{});
myTable.insert("PositionX", QVariant{});
myTable.insert("PositionY", QVariant{});
myTable.insert("BackgroundColor", QVariant{});

// Copy the prototype row and initialize it
DStruct myRow = myTable;
myRow["ID"] = 5;
myRow["PositionX"] = 12;
...
使用DStruct=QMap;
//创建一个原型行
数据结构myTable;
插入(“ID”,QVariant{});
插入(“位置X”,QVariant{});
插入(“位置Y”,QVariant{});
插入(“背景色”,QVariant{});
//复制原型行并初始化它
DStruct myRow=myTable;
myRow[“ID”]=5;
myRow[“位置X”]=12;
...

你不能那样做。最好的选择是使用qmap。这允许您将值存储在一个结构中,该结构具有值的命名键。您可以将键指定为您喜欢的任何值,例如数据库中的列名。非常好的解释。我承认我对这个理论不太在行。我因为问这个问题而被否决了很多。现在感觉很好。要改进此答案,我可以执行以下操作。对于(i=0),IsRe反射并不是直接相关的,因为您没有得到关于C++ C++结构的任何信息。所以,是的,您应该删除该标记。使用
Q_OBJECT
Q_GADGET
宏向类添加反射信息,但该信息仅限于显式声明的属性、信号、插槽和可调用属性。它不包括数据成员或其他方法。