000
15.09.2006, 16:33 Uhr
Yadgar
|
High!
Folgende Ausgangssituation:
Die hinlänglich bekannte Basisklasse für Brüche, FractInt; dazu eine weitere Basisklasse NamedObjectBase, die als Mitglied nur ein string-Objekt für einen Namen hat:
C++: |
//-------------------------------------------------------------------------------- // NamedObjectBase // class NamedObjectBase { protected: //--- Name eines Objektes // 1. Muss systemweit eindeutig sein // 2. Muss mindestens 3, höchstens 128 Zeichen enthalten // NamedObjectBase(string aName); ~NamedObjectBase(); public: //--- liefert den Objektnamen // string getObjectName() const; protected: string mName; };
|
Von beiden Basisklassen erbt die Ableitung NamedFractInt:
C++: |
//-------------------------------------------------------------------------------- // NamedFractInt // class NamedFractInt : public FractInt, public NamedObjectBase { public: NamedFractInt(string aName, int aZaehler, int aNenner=1); NamedFractInt operator += (int); friend NamedFractInt operator + (const NamedFractInt&, const NamedFractInt&); private: };
|
Um die Namen sämtlicher NamedFractInt-Objekten verwalten zu können, existiert ein globales Array von NamedObjectBase-Objekten.
Da Konstruktor und Destruktor von NamedBaseObjekt gleichzeitig zur Verwaltung dieses Arrays verwendet werden:
C++: |
//----------------------------------------------------------------------------- // Allgemeiner Konstruktor // NamedObjectBase::NamedObjectBase(string aName) : mName(aName) { //-- Prüfung auf Namenskonvention // int l = aName.length(); if (l<3 || l>128) { cout << "Objektname muss mindestens 3 und darf h" << (char)148 << "chstens 128 Zeichen lang sein!" << endl; exit (1); } //-- Prüfung auf Eindeutigkeit // for (int i=0; i<gObjects.size(); i++) { NamedObjectBase* p = gObjects[i]; if (p->mName == mName) { cout << "{" << mName << "}: Objektname ist bereits registriert" << endl; exit (1); } } // O.k., Objektname ist gültig. Eintragen in den vector // gObjects.push_back(this); }
//----------------------------------------------------------------------------- // Destruktor // NamedObjectBase::~NamedObjectBase() { vector<NamedObjectBase*>::iterator it = find(gObjects.begin(), gObjects.end(), this); gObjects.erase(it); }
|
muss dass vector-Array gObjects schon in der Klassen-Implementationsdatei bekannt sein.
Also beginnt meine Klassenimplementationsdatei für die drei genannten Klassen mit
vector<NamedObjectBase*> gObjects; // globaler Vektor zur Aufnahme der Objektnamen
während in der Hauptprogrammdatei auf gObjects mit extern verwiesen wird.
Trotzdem bekomme ich beim Kompilieren gleich für die Hauptprogrammdatei folgende Fehlermeldungen:
expected init-declarator before '<' token
und
expected `,' or `;' before '<' token
folglich ist gObjects im weiteren Verlauf der Datei nicht bekannt.
Was bitte ist ein init-declarator? Ich habe mich einfach an die Syntax im Lehrbuch gehalten...
Bis bald im Khyberspace!
Yadgar -- Flagmaker - ein Programmier-Blog Dieser Post wurde am 15.09.2006 um 16:33 Uhr von Yadgar editiert. |