gelöst: Klassen Programmweit nutzen können
-
Moin moin,
ich habe da ein kleines Problem bei dem ich einfach nicht weiterkomme. Vermutlich denke ich im Moment einfach zu verdreht!

Also mein Problem:
Ich möchte in einem Programm von mir, C++ (QT4, programmiert mit Qt Creator unter Linux) eine Klasse mehrfach nutzen:
db_klasse.h
#ifndef DB_KLASSE_H #define DB_KLASSE_H class db_klasse : public QObject { Q_OBJECT public: db_klasse(void); ~db_klasse(void); bool open_database(); void close_database(); int get_data(); private: QSqlDatabase datenbank; }; extern db_klasse dbklasse; #endifNun möchte ich gerne die Klasse db_klasse überall in meinen Quelldateien nutzen können. Also einmal initialisiert und dann in main.cpp / abfrage.cpp / eingabe.cpp und so weiter nutzen können. Wie aber mache ich das?? Ich stehe da im Moment echt auf dem Schlauch.
Wenn ich die Klasse in main.cpp so aufrufe:
db_klasse *dbklasse = new db_klasse;kann ich sie dort nutzen, in anderen Programmteilen (abfrage.cpp / eingabe.cpp) aber nicht. Es ist mir sehr wichtig, dass die Klasse selber nur einmal in meinem Programm initialisiert wird und eben nicht mehrfach.
navy_seabear
-
Schau dir einmal das "Singleton Pattern" an. Wahrscheinlich suchst du das.
-
icarus2 schrieb:
Schau dir einmal das "Singleton Pattern" an. Wahrscheinlich suchst du das.
Und noch wahrscheinlicher willst Du doch kein Singleton, glaubst aber es zu wollen...
-
theta schrieb:
Und noch wahrscheinlicher willst Du doch kein Singleton, glaubst aber es zu wollen...
Jetzt bin ich wirklich verwirrt.
Ich möchte meine Klasse, welche eine Verbindung zu einer Datenbank aufbaut nur einmal initialisieren.
Danach möchte ich gerne die weiteren Funktionen der Klasse in anderen Programmteilen nutzen und auf die Datenbank zugreifen. Also auch alle initialisierten Variablen der Klasse nutzen können.
Wenn ich dann mein Programm beende, soll die eine erzeugte Klasse und damit alle in ihr enthaltenen Variablen zerstört werden.NavySeabear
-
Wenn nur eine Instanz der Klasse existieren soll, würde ich keine globale Variable empfehlen, sondern stattdessen die Klasse static machen, sodass deine Funktionsaufrufe wie folgt aussehen:
if (db_klasse.open_database()) { // ... db_klasse.close_database(); }
-
DerCoder schrieb:
Wenn nur eine Instanz der Klasse existieren soll, würde ich keine globale Variable empfehlen, sondern stattdessen die Klasse static machen, sodass deine Funktionsaufrufe wie folgt aussehen:
if (db_klasse.open_database()) { // ... db_klasse.close_database(); }Es wird immer absurder hier..
Für genau so etwas gibt es Zeiger und Referenzen. Es ist wirklich nicht zu schwierig, eine Referenz im Programm herumzureichen. Das macht die Abhängigkeiten zwischen Klassen deutlich und verhindert damit ein Durcheinander.
struct KlasseDieDieDatenbankBenutzt { explicit KlasseDieDieDatenbankBenutzt(db_klasse &db) : m_db(db) { } void machWas() { cout << m_db.get_data() << endl; } private: db_klasse &m_db; }; int main() { db_klasse db; KlasseDieDieDatenbankBenutzt benutzer(db); benutzer.machWas(); }
-
navy_seabear schrieb:
Wenn ich die Klasse in main.cpp so aufrufe:
db_klasse *dbklasse = new db_klasse;... sagt mir, daß Du ein (gutes) Buch über C++ durcharbeiten solltest.
-
Swordfish schrieb:
navy_seabear schrieb:
Wenn ich die Klasse in main.cpp so aufrufe:
db_klasse *dbklasse = new db_klasse;... sagt mir, daß Du ein (gutes) Buch über C++ durcharbeiten solltest.
ja, mag sein. Ich muß bestimmt noch viel lernen. Doch hilfreich ist die Antwort nicht wirklich, oder?
Wenn Du eine Lösung weißt, oder mir sagen kannst wie ich es besser oder richtig machen kann, wäre ich Dir sehr Dankbar!
Das würde mich vermutlich auch in meinem Verständnis für C++ weiter bringen.NavySeabear
-
Du hast in bd_klasse.h:
extern db_klasse dbklasse;- Woimmer Du dbklasse verwenden willst mußt Du db_klasse.h inkludieren.
- In einer dieser Dateien mußt Du noch für die eigentliche Instanz sorgen:db_klasse dbklasse;