2016-08-08 35 views
2

Mein Ziel des Projekts ist, einige Berechnungen anzuzeigen und durchzuführen, wie zum Vergleich auf die Daten von MySQL-Datenbank. Die MySQL-Datenbank enthält viele Tabellen und die erste Zeile in jeder Tabelle enthält die Namen des Feldes wie ID, Name, PositionX, PositionY, BackgroundColor und ihre Werte in der unteren Zeile.Erstellen Sie eine dynamische Datenstruktur von MySQL in Qt C++

Was ich brauche, ist eine dynamische Datenstruktur in C++/Qt mit dem Namen der Variablen gleich dem Namen des Feldes zu erstellen. So dass ich die Werte basierend auf der gewählten Tabelle speichern kann

Also wenn ich mein Problem in kleinere Schritte teile
1. um den Datentyp basierend auf den Werten zu identifizieren.
2. den Namen der Variablen zu erzeugen, die den Namen in der Zeile der Tabelle mysql entsprechen.
3. eine dynamische Struktur

Beispiel für eine MySQL-Tabelle

ID PositionX PositionY Background
0x32 233 256 0x3366

mit Feldern erstellen I

struct table 
{ 
int ID,PositionX,PositionY,BackgroundColor; 
}mytable; 
eine statische Datenstruktur erstellen

Kann ich diese Struktur dynamisch generieren?

PS: - (Ich habe ein wenig gesucht und ich habe mit einem Begriff namens Reflexion gefunden, aber konnte nicht verstehen, wie ich in der Informatik vor kurzem (2 Jahre) bewegt habe, weiß ich nicht, ob ich auf dem richtigen Weg bin). Einige Beispielcode sollte mir besser als Theorien helfen.

+0

Sie nicht das tun kann. Die beste Option ist die Verwendung einer qmap. Dadurch können Sie die Werte in einer Struktur mit benannten Schlüsseln für die Werte speichern. Sie können den Schlüsseln beliebige Werte zuweisen, z. B. die Spaltennamen in der Datenbank. –

Antwort

1

Sie müssen die Theorie zuerst verstehen, tut mir leid, sonst wird nichts davon für Sie einen Sinn ergeben.

Ein C++ - Compiler führt Namenslöschung und viele Löschvorgänge aus. Das heißt, sobald der Compiler den Code kompiliert hat, ist der Objektspeicher namenlos und meist typenlos. Nur die Arten von Strukturen mit virtuellen Methoden sind bekannt - über ihre Mitglieder ist jedoch nichts bekannt. Eine Struktur als Konzept existiert nur während der Code kompiliert wird. Dieses Konzept hört auf zu existieren, sobald der Compiler fertig ist.

Das Sprechen von einer "dynamischen" Struktur macht in C++ keinen Sinn, weil zur Laufzeit der Objektcode nichts darüber weiß, was eine "Struktur" ist.

Sie können das Kompilierungszeit-Strukturkonzept zur Laufzeit nicht wiederverwenden, sondern müssen stattdessen Ihr eigenes Konstrukt entwerfen. Da Sie Qt verwenden, können Sie eine Laufzeit generierte Struktur als eine Karte von Namen zu Varianten darstellen: QMap<QString, QVariant>. Ein QVariant kann jeden Typ speichern, der dem Qt-Metatypensystem bekannt ist, und Sie können dieses System über alle benutzerdefinierten Typen informieren, die Sie ebenfalls verwenden.

Ihre table würde wie folgt aussehen, dann:

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

Hervorragende Erklärung. Ich bin nicht so gut mit der Theorie. Ich wurde sehr enttäuscht, weil ich diese Frage gestellt hatte. Fühlt sich jetzt gut an. Um diese Antwort zu verbessern, kann ich Folgendes tun. für (i = 0; i <= Spaltenanzahl(); i ++) mytable.insert (stringatcolumn (i), Qvariant {}); Könnten Sie uns noch erklären, ob dieses Thema unter die Lupe genommen wird?Sonst werde ich die Reflexion von ihm entfernen. Da ich möchte –

+0

Reflexion ist nicht direkt verwandt, da Sie keine Informationen über die Struktur des C++ - Codes erhalten. Also ja, Sie sollten dieses Tag entfernen. Eine Reflektion ist derzeit für beliebigen C++ - Code ohne die Verwendung zusätzlicher Tools nicht möglich. Qt's Meta-Objekt-Compiler (MoC) fügt Reflektionsinformationen zu Klassen mit dem Makro 'Q_OBJECT' oder' Q_GADGET' hinzu, aber diese Information ist auf explizit deklarierte Eigenschaften, Signale, Slots und aufrufbare Eigenschaften beschränkt. Datenelemente und andere Methoden werden nicht behandelt. –