erzeugte Objekte in versch Klassen
-
Hey
einen schönen guten Abend ins Forum.Ich habe da ein Problem mit erzeugten Objekten. Ihr könnt mir da bestimmt helfen:
Also in einer klasse Controller wird im Konstrukror ein Objekt aDatabase angelegt.
im Cpp:Controller:: Controller () { aDatabase = new Database; }
im H:
class Controller { private: Database* aDatabase; }
Im weiteren Verlauf in der Klasse habe ich eine Funktion initDB:
void Controller::initDB() { aDatabase->readData(); }
Hiermit wird die Datenbank eingelesen. Fein!
Jetzt will ich in einer anderen KLasse "Abfrage" allerdings mit diesem Objekt weiterarbeiten.
char* Query::getId () { aDatabase->getId(); }
Eigentlich müsste ich ja jetzt hier nochmal ein Objekt anlegen damit das funktioniert. Allerdings will ich das nicht, weil ich sonst nicht auf die Daten, die ich mit readData eingelesen hab zugreifen kann.
Nun meine Frage: Wie kann ich das Objekt so erzeugen, dass alle KLassen darauf zugreifen können und damit arbeiten können???
Vielen Dank
-
Zum Beispiel, indem Du den Controller ein leeres Query erzeugen lässt und dabei das DB-Objekt mitgibst:
class Query { public: Query(Database *db); private: Database *adatabase; }; Query::Query(Database *db): adatabase(db) { } char* Query::getId () { aDatabase->getId(); }
Und im Controller:
class Controller { public: Query* makeEmptyQuery(); }; Query* Controller::makeEmptyQuery() { return new Query(adatabase); }
Das ist natürlich nur eine von vielen Möglichkeiten
-
kann ich das auch so machen:
im Konstruktor vom Controller:Controller::Controller(){ aDatabase = new Database(); m_Query = new Query (aDatabase); }
im h:
Database* aDatabase; Query* m_Query;
<<<<
im Konstruktor von Query
Query:: Query (aDatabase) { <<<<<<< m_Database = aDatabase; }
im h:
Controller* m_Database;
ich habs probiert, aber mein Compiler meckert.... an den Stellen die ich markiert habe.
1. Query kennt er nicht.
2. aDatabase kennt er nichtNe Idee, was ich vergessen hab?
DANKE
-
Typ vergessen ?
Query:: Query (Database *aDatabase) { <<<<<<<
Kurt
-
wenn von einem objekt programmweit nur eine instanz bestehen soll, die von vielen objekten benötigt wird, kann man dafür auch das singleton konstrukt verwenden.
#include <iostream> using namespace std; class Singleton { private: static Singleton *instanz; Singleton() : payload(0) {} public: int payload; // zum testen static Singleton* getInstance() { if(instanz) return instanz; else return instanz = new Singleton; } void doStuff(){ ++payload; } }; Singleton* Singleton::instanz = 0; void a() { Singleton *lokal = Singleton::getInstance(); lokal->doStuff(); } void b() { Singleton *lokal = Singleton::getInstance(); lokal->doStuff(); } int main(int argc, char *argv[]) { Singleton *lokal = Singleton::getInstance(); cout << lokal->payload << endl; a(); cout << lokal->payload << endl; b(); cout << lokal->payload << endl; }