Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Einbindung von <vector> bei Modularisierung macht Probleme

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.09.2006, 09:57 Uhr
stephanw
localhorst


NamedObjectBase nicht deklariert vor der Vektor-Definition ?


C++:
#include <vector>

class NamedObjectBase;

std::vector<NamedObjectBase*> gObjects;



Aber anstelle eine globale Variable zu nehmen, solltest Du lieber einen statischen Vector in NamedObjectBase verwenden.


C++:
class NamedObjectBase
{
  public:
    NamedObjectBase( const string& aName);
    virtual ~NamedObjectBase();

    string getObjectName() const;

    /// Insert the object if the name doesn't exists.
    static bool insertObjectUnique( NamedObjectBase* obj );
    static NamedObjectBase* findObjectByName( const string& name );
  private:
    static vector<NamedObjectBase*> sObjects;
    string mName;
};

--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 18.09.2006 um 10:02 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: