Bronski hat geschrieben:Ich möchte für jede Datenbankstruktur(jedes Datenmodell) eine Klasse haben.die sämtliche Zugriffe abhandelt
(Tdsa_orte_db) und sämtliche Ergebnismengen enthält. Dieser wollte ich die Verbindungsdaten gleich mitgeben. Da aber ein QSqlDatabase Objekt mehrere Verbindungen beinhalten kann scheint es mir sinnvoll das anders zu abstrahieren.
Ein QSqlDatabase-Objekt enthält GENAU EINE Verbindung! QSqlDatabase managed aber auch statische Member, in denen mehrere Verbindungen gespeichert werden. ->
typedef QHash<QString, QSqlDriverCreatorBase*> DriverDict;
Wenn du verhindern willst, dass niemand über QSqlDatabase::database() an deine Verbindung kommt, ist der Ansatz mit Erben vllt. zu vertreten. Dann solltest du aber private von QSqlDatabase erben, damit das Objekt von außen nicht als QSqlDatabase-Objekt verwendet werden kann, und somit dein Versuch schon im Ansatz fehlschlägt
.
Zum Rest:
1) Wo ist da das Problem? die Übergabe des driver_name? Der Basisinitialisierer? Aber so schaut in jedemfall eine korrekte Basisinitialisierung mit einem non-default-Konstruktor aus.
2) Ja, sry, hab ich nicht gesehen dass der nur protected ist. Ja, wenn du erbst kannst du auf protected-Member zugreifen - auch auf den Konstruktor. Du willst aber dann den Konstruktor als Basisinitialisierer aufrufen.
Und wenn ein Code nicht kompiliert, ist es immer gut die Fehlermeldung zu lesen (meistens steht da alles relevante drin), wenn du sie nicht verstehst solltest du sie mitposten.
3) Was ist für dich ein "Frontend"? Ein Programm, in dem der User queries an die db schickt und die Ergebnisse präsentiert bekommt? Oder eine (statische) Sicht auf die Daten, die Queries sind vordefiniert (und vorm User versteckt), ebenso das komplette Tabellenlayout usw.
Wenn deine Klasse dieses eine bestimmte QSqlQuery-Objekt über die komplette Lebenszeit benötigt, kannst du es natürlich als Member speichern (gilt übrigens nicht nur für QSqlQuery). In den meisten Fällen ist das aber nicht notwendig, Queries werden dynamisch generiert und das Ergebnis gleich verarbeitet, das Query-Objekt wird danach nicht mehr benötigt. So wie ich sehe hast du auch ein QSqlQueryModel. Dieses speichert doch sowieso schon das Query ab (weil dieses Model das auch so braucht), dann brauchst du doch das Query nicht noch separat speichern.
Was für Funktionen wären das denn?
Ich sehe beim Design das Problem, dass du die Sicht auf eine Tabelle in einer eigenen Klasse kapseln willst. Eine Datenbank hat aber meist mehrere Tabellen, die untereinander verknüpft sind (Relationen).
Aber ohne genauerer Beschreibung des Problems + mehr Code (z.B. die vollständige Klassendefinition) kann man da eigentlich gar nix sagen