Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » vector global bekanntmachen???

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
03.09.2004, 14:39 Uhr
~Dani
Gast


Hallo!

Ich habe in einer datei medium.h einen vector (vector<Medium> mainVec)
und in der medium.cpp folgendes:

C++:
vector<Medium> Medium::getMainVec()
{
    return mainVec;
}

void Medium::setMainVec(Medium obj)
{
    mainVec.push_back(obj);
}




Das Problem ist jetzt, dass dieser Vector scheinbar bei jedem Aufruf neu erstellt wird und somit leer ist.

Gibt es eine Möglichkeit den Vector global bekanntzumachen, dass also in unterschiedlichen Methoden Objekte angehängt werden können und wirklich immer der schon gefüllte Vector benutzt wird?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.09.2004, 16:02 Uhr
virtual
Sexiest Bit alive
(Operator)


Mal völlig losgeöst von anderen Problemen:

C++:
vector<Medium> Medium::getMainVec()
{
    return mainVec;
}


Ist nicht das was du willst: Diese Funktion erzeugt eine Kopie von mainVec. Wenn Du den vector also so holst, arbeitest Du auf eine kopie diese globalen Objects. Richtig wäre hier, eine Referenz zurückzugeben, also:

C++:
vector<Medium>& Medium::getMainVec()
{
    return mainVec;
}


Allerdings mußt Du beim Zugriff weiterhin darauf achten, daß du auf der Referenz weiterarbeitest und keine impliziten Kopien machst:

C++:
Medium m;
...
vector<Medium>& okay = m.getMainVec(); // Okay
vector<Medium> bad = m.getMainVec(); // Bad



Eigentlich sollte ich Dir garnicht helfen, diesen Ansatz weiter zu verfolgen, denn:

Eine Todsünde ist es, globale Variablen in Headern zu definieren, weil man im Falle mehrerer Übersetzungseinheiten (also .c/.cpp Dateien), welche den Header benutzen, mehrfach definierte Symbole hat. Genau das scheinst du zu machen.
Zwar ist es legetim, globale Variablen in headern zu [i]deklarieren[/í], aber auch hiervon ist in der Regel abstand zu halten, weil du dann keine Kontrolle mehr hast, wer wann darauf zugreift.

Aus objektorientierter Sicht ist eine globale Variable ein Singleton, also eine Klasse, welche sich nur einmal instantieren läßt. Und genau so würde ich das dann auch machen: Ein Singleton draus machen, falls sich die globale Variable nicht eindeutig einer Klasse zuordnen läßt:

C++:
class MainVec
{
    std::vector<Medium> vec;
private:
     MainVec() { };
     MainVec(const MainVec&);

public:
    static MainVec& theInstance() {
         static MainVec singleton;
         return singleton;
    }

    // Hier normale zugriffsfunktionen wie zB push_back, size(), usw...
};

...
// Anwendung:
void f()
{
    MainVec& mainVec = MainVec::theInstance();
    // ... mit mainVec arbeiten
}


Ist zwar auf den ersten Blick etwas aufwendiger, langfristig aber die deutlich bessere Wahl als eine globale Variable, die ausserhalb jede Zugriffskontrolle steht.

Wenn Du jedoch deine globale Variable rein semantisch eindeutig einer Klasse zuordnen kannst, dann kannst du natürlich auch Class-Attributes verwenden:

C++:
class Medium
{
private:
    static std::vector<Medium> mainVec;
    ...
public:
    // Nur, wenn außerhalb von Medium benötigt:
    static std::vector<Medium>& getMainVec() { return mainVec; }
};


Diese Lösung ist der vorherigen vorzuziehen, wenn Du die Aussage treffen kannst, daß mainVec allen Instanzen von "Medium" gehört, nicht jedoch anderen Klassen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.09.2004, 11:33 Uhr
~Dani
Gast


Erstmal danke für den Tipp mit der Referenz!

Zum Rest:
der Vector ist ein Attribut der Klasse Medium.
So haben wir es bisher in der Medium.h:

C++:
class Medium
{
     private:
            vector<Medium> mainVec;

     public:
            vector<Medium> getMainVec(); //da muss jetzt die Referenz hin
}



hab mich da wohl etwas ungeschickt ausgedrückt, sorry
 
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: