operator[]
-
Hi,
ich hab mir einen eigenen Container geschrieben der wie ein vector funktionieren soll. Dieser Container speichert Zeiger auf meine Klasse "Daten".
Jetzt möchte ich den operator [] schreiben. Allerdings weis ich nicht so richtig wann (und vor allem warum) man da ein Konstantes Objekt oder so zurückgeben soll. Oder ab wann man (unwissentlich) eine lokale Kopie zurückgibt.
Hier mal das was ich bis jetzt geschrieben hab:
class DatenArray { //weiteres zeugs... Daten& operator[] (size_t index); private: CTypedPtrArray<CPtrArray, Daten*> m_Daten; } Daten& DatenArray::operator[] (size_t index) { ASSERT(CheckIndex(index)); try { return *(m_Daten[index]); } catch(.../*CMemoryException& e*/) { // throw e; } }Dieses DatenArray soll zwar Zeiger speichern, aber Referenzen auf die Objekte zurückgeben (mein ganzes Programm arbeitet nur mit Call by Reference)
Und dann hab ich im Forum irgendwo gelesen das man const Referenzen zurückgeben sollte. Aber warum? Mit dem zurückgegebenen Element soll man doch arbeiten können (Member ändern usw...).
Ausserdem hab ich hier noch das Problem, das ich, falls der Index zu groß ist, nicht einfach NULL zurückliefern kann. Das wollte ich lösen in dem ich die Ausnahme abfange und weitereiche. Naja alle meine Versuche das hinzukrigen sind gescheitert (ich kriege die Syntax dafür nicht richtig hin).
Nochmal zusammengefasst:

Ist meine operator [] Methode nun so richtig oder sollte ich doch lieber const Referenzen zurückliefern? Wie sieht die Syntax zum werfen/weiterreichen einer Ausnahme aus (hab nichts in google gefunden, zumindest konnte ich das nicht umsetzen) ?
-
1. Ja, der Aufbau ist so richtig - wenn du das zurückgegebene Element ändern willst, mußt du eine nichtkonstante Referenz übergeben.
(const Referenz kannst du für die const-Version des Operators verwenden)
2. try/catch dient zum Abfangen fremder Exceptions - eigene Exceptions wirfst du mit throw (anstelle deines ASSERT)
if(!CheckIndex(index) throw CMyException("Fehler in op[]"); ...
-
danke
CStoll schrieb:
1. Ja, der Aufbau ist so richtig - wenn du das zurückgegebene Element ändern willst, mußt du eine nichtkonstante Referenz übergeben.
(const Referenz kannst du für die const-Version des Operators verwenden)
wofür brauch man die const-Version?
-
Wenn du deine Klasse als Konstante weitergibst, kannst du nur Methoden aufrufen, die mit "const" markiert sind:
void do_something(const DatenArray& data) { //hier kannst du den "normalen" op[] nicht verwenden, stattdessen brauchst du //const Daten& operator[](size_t index) const; }
-
Chris++ schrieb:
wofür brauch man die const-Version?
Für den Zugriff auf die Elemente eines const DatenArray.
-
perfekt, jetzt klappts
