Feldzugriffsoperator überladen für Zeiger auf Objekte einer Klasse?



  • Hallo!

    Ich schreibe gerade eine Implementierung eines B-Baums und habe folgendes Problem welches ich noch nicht lösen konnte:

    Ich nutze eine Klasse Knoten die wiederum ein Feld von Datensätzen enthält. Die Grösse des Feldes richtet sich nach dem Minimalgrad des Baums, was allerdings für mein Problem eher nebensächlich ist. Das ganze sieht also bisher so aus:

    class Knoten{
       private:
       Datensatz inhalt[2*_T-1];
       .
       .
       .
    

    Um nun von ausserhalb der Klasse möglichst "elegant" auf einen Datensatz zugreifen zu können, wollte ich den Feldoperator für die Klasse Knoten überladen, so dass er die Referenz auf einen Datensatz zurückliefert. Sieht so aus und funktioniert auch ganz gut:

    class Knoten{
       private:
       Datensatz inhalt[2*_T-1];
       .
       .
       .
       public:
       Datensatz& operator [] (const int index){
          return inhalt[index];
       }
       .  
       .
       .
    

    Mein Problem ist nun, dass ich im Hauptprogramm nur mit Zeigern auf Knoten hantiere. Um den Feldzugriffsoperator nutzen zu könnnen, muss ich also den Zeiger erst dereferenzieren:

    Knoten* k;
    (*k)[0]=Datensatz(schluessel, wert);
    

    Mich würde jetzt interessieren, ob es auch eine Möglichkeit gibt den Feldoperator so zu überladen, dass folgender Zugriff möglich wäre:

    Knoten* k;
    k[0]=Datensatz(schluessel, wert);
    

    Dazu habe ich zunächst versucht den Feldzugriffsoperator in folgender Form ausserhalb der Klasse zu überladen:

    Datensatz::Datensatz& operator [] (Knoten::Knoten* k, int index) {
       return k->inhalt[index];
    }
    

    Der Compiler bricht jedoch mit der Fehlermeldung ab, dass die Funktion eine Member-Funktion sein muss.

    Mein nächster Ansatz war es, eine Typumwandlung von Knoten* in Knoten zu implementieren:

    Knoten::Knoten& operator (Knoten::Knoten* k){
            return *k;
    }
    

    das liefert jedoch die Compilerfehlermeldung

    error: abstract declarator `Knoten&' used as declaration|
    

    Hat jemand einen Tipp, was ich noch versuchen könnte?



  • Wenn die Ueberladung erfolgreich waere, wie wuerde man dann auf die einzelnen Elemente eines Array der Form zu greifen:

    Knoten knotenArray[15];
    knotenArray[1]; // ??
    

    Ich will damit sagen, dass dein Vorhaben keine gute Idee ist.



  • Achso, Du meinst, dass ich quasi die "Originalfunktion" des []-Operators verlieren würde? Das ist natürlich ein berechtigter Einwand, allerdings wäre das für mein überschaubares Programm nicht von Bedeutung, da die Knoten nicht in einem Feld oder vector gespeichert sind, sondern in einer verzeigerten Baumstruktur in der kein indizierter Zugriff vorgesehen ist.

    Ausserdem würde mich auch interessieren, ob es prinzipiell möglich ist den Feldoperator auf Zeiger eines Objektes anzuwenden.


Log in to reply