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) |