[gelöst] Type als Rückgabe
-
Hallo,
Ich weiß nicht ob der Titel das so trifft, also mal von Anfang die Erklärung...
Ich programmiere für verschiedene Datenbanken. Mithilfe von ODBC und OLE DB. Damit ich mir für MySQL oder MSSQL keine Gedanken über die Struktur der Klasse und die Befehle machen muss lege ich die Befehle immer identisch an. Also gibt es immer die Funktion GetSession, die mir ein Handle zurück gibt für den Query. Damit ich den Type definieren kann ist der in der .h als #define deklariert.
#define MSSQLRes unsigned long class MSSQL { public: MSSQLRes GetSession(...); MYDATA GetQuery(MSSQLRes, ...); } struct MySQLHandle { unsigned int res; unsigned short res2; }; #define MySQLRes MySQLHandle class MySQL { public: MySQLRes GetSession(...); MYDATA GetQuery(MySQLRes, ...); }Solange ich in meinem Code weiß, was es für eine Datenbank ist, kann ich immer über den #define den richtigen Typen anlegen.
Mein Problem ist es, wenn ich über ein Init-File den Datenbank-Typen bekomme. Dafür hätte ich gerne eine Deklaration ähnlich wie:
main { switch (dbtype) { case MSSQL: mydb = new MSSQL; break; case MySQL: mydb = new MySQL; break; } mydb::HandleType handle; // <-- Hier handle = mydb->GetSession(); MYDATA data; data = mydb->GetQuery(handle, "Select * from..."); }Ist natürlich Pseudo-Code. Da wo hier steht bräuchte ich eine Lösung. Ich bekomme von irgendwoher einen Zeiger mit einer Datenbank-Klasse zurück und muss nun den richtigen Typen für mein Handle erzeugen. Dieses Handle kann verschiedenster Weise sein. Gibt es eine Möglichkeit so etwas zu realisieren?
Danke,
Stefan
-
Abstrakte Basisklasse und dann davon ableiten.
-
drakon schrieb:
Abstrakte Basisklasse und dann davon ableiten.
???
Bin noch nicht so fit in C++ wie ich das gerne wäre.
-
stefanjann schrieb:
???
Bin noch nicht so fit in C++ wie ich das gerne wäre.
Dann schnapp dir das Buch/Tutorial deiner Wahl und informier dich dort darüber was Vererbung, ableiten und abstrakte Basisklassen sind. Dort wird das viel ausführlicher und verständlicher stehen als das hier jemand auf die Schnelle tippen kann.
-
Was Klassen, Basisklassen und Vererbung sind weiß ich schon, ich kann nur den Zusammenhang hier nicht finden. Was soll ich wohin vererbenen um meine gewünschte Art und Weise zu erzeugen. Das verstehe ich nicht.
Wenn ich ne Mutterklasse
class MutterSQL {}; class MSSQL : public MutterSQL {}; class MySQL : public MutterSQL {};mache, bringt mich das jetzt nicht wirklich meinem gewünschten Ergebnis weiter, oder?
-
stefanjann schrieb:
Wenn ich ne Mutterklasse
class MutterSQL {}; class MSSQL : public MutterSQL {}; class MySQL : public MutterSQL {};mache, bringt mich das jetzt nicht wirklich meinem gewünschten Ergebnis weiter, oder?
Nur wenn du die Methodensignatur vereinheitlichen kannst. Dann aber wäre es eine sinnvolle Lösung. Davon abgesehen: Typedefinitionen macht man mit:
typedef <Originaltyp> <Neue Bezeichnung>;cu André
-
Auf gut Deutsch:
Mein Gedankengang ist schwachsinn, weil ich mich für meine SQL-Klassen auf ein MySQLRes und MsSQLRes einigen soll. Also lieber den Struct folgt anlegen:struct AllSQLHandle { unsigned long res; unsigned short res2; };und bei MsSQL den res2 ignorieren.
OK. Schade eigentlich, aber wenn das der "richtige" Weg ist....