【问题标题】:Create a dynamic datastructure from mysql in qt C++在 qt C++ 中从 mysql 创建一个动态数据结构
【发布时间】:2016-08-08 15:28:06
【问题描述】:

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

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

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

包含字段的mysql表示例

ID PositionX PositionY BackgroundColor
0X32 233 256 0x3366

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

struct table
{
int ID,PositionX,PositionY,BackgroundColor;
}mytable;

我可以动态生成这个结构吗?

PS:-(我搜索了一下,遇到了一些叫做反射的术语,但由于我最近(2年)转向计算机科学而无法理解,我不知道我是否走在正确的道路上) . 一些示例代码应该比理论更好地帮助我。

【问题讨论】:

  • 你不能那样做。最好的选择是使用 qmap。这允许您将值存储在具有值的命名键的结构中。您可以将键分配为您喜欢的任何值,例如数据库中的列名。

标签: c++ qt data-structures dynamic-programming


【解决方案1】:

抱歉,您确实需要先了解理论,否则这对您没有任何意义。

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

在 C++ 中谈论“动态”结构是没有意义的,因为在运行时目标代码对什么是“结构”一无所知。

您不能在运行时重用编译时结构的概念,而必须自己设计。由于您使用的是 Qt,因此您可以将运行时生成的结构表示为从名称到变体的映射:QMap<QString, QVariant>QVariant 可以存储 Qt 元类型系统已知的任何类型,您也可以让该系统知道您可能正在使用的任何自定义类型。

您的table 将如下所示:

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;
...

【讨论】:

  • 很好的解释。我同意我对这个理论不是很好。问这个问题我被否决了很多。现在感觉很好。为了改进这个答案,我可以执行以下操作。 for(i =0 ;i
  • 反射不直接相关,因为您没有获得任何有关 C++ 代码结构的信息。所以是的,您应该删除该标签。如果不使用其他工具,目前无法对任意 C++ 代码进行反射。 Qt 的元对象编译器 (moc) 将反射信息添加到具有 Q_OBJECTQ_GADGET 宏的类中,但该信息仅限于显式声明的属性、信号、插槽和可调用属性。它不包括数据成员或其他方法。
猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 2014-05-23
  • 2023-04-03
  • 1970-01-01
  • 2017-11-04
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多