C++ Überladen des Klassenmember-Zugriffsoperators ->

C++ Operatorüberladung und Funktionsüberladung

Der Klassenmember-Zugriffsoperator (->) kann überladen werden, aber er ist ziemlich problematisch. Er wird definiert, um einer Klasse ein "Zeiger"-Verhalten zu verleihen. Der Operator -> muss eine Memberfunktion sein. Wenn der Operator -> verwendet wird, muss der Rückgabetyp ein Zeiger oder ein Klassenobjekt sein.

Der Operator -> wird normalerweise in Kombination mit dem Zeiger-Dereferenzierungsoperator * verwendet, um "Smart-Pointer"-Funktionalität zu implementieren. Diese Zeiger sind Objekte, die sich wie normale Zeiger verhalten, außer dass sie andere Aufgaben ausführen, wenn Sie über den Zeiger auf ein Objekt zugreifen. Wenn beispielsweise der Zeiger zerstört wird oder wenn der Zeiger auf ein anderes Objekt zeigt, wird das Objekt automatisch gelöscht.

Der Dereferenzierungsoperator -> kann als unärer Postfix-Operator definiert werden. Das heißt, gegeben eine Klasse:

class Ptr{
   //...
   X * operator->();
};

ClassPtrObjekte können verwendet werden, um auf Klassen zuzugreifen.XIhre Mitglieder werden in einer Weise verwendet, die Zeigern sehr ähnlich ist. Zum Beispiel:

void f(Ptr p )
{
   p->m = 10 ; // (p.operator->())->m = 10
}

Die Anweisung p->m wird als (p.operator->())->m interpretiert. Ebenso zeigt das folgende Beispiel, wie der Klassenmember-Zugriffsoperator -> überladen wird.

Beispiel

#include <iostream> #include <vector> using namespace std; // Angenommen, eine tatsächliche Klasse class Obj { static int i, j; public: void f() const { cout << i++ << endl; } void g() const { cout << j++ << endl; } }; // Definition eines statischen Members int Obj::i = 10; int Obj::j = 12; // Implementiere einen Container für die oben stehende Klasse class ObjContainer { vector<Obj*> a; public: void add(Obj* obj) { a.push_back(obj); // Rufe die Standardmethoden des Vektors auf } friend class SmartPointer; }; // Implementiere einen Smart Pointer für den Zugriff auf Mitglieder der Klasse Obj class SmartPointer { ObjContainer oc; int index; public: SmartPointer(ObjContainer& objc) { oc = objc; index = 0; } // Der Rückgabewert zeigt das Ende der Liste an bool operator++() // Präfixversion { if(index >= oc.a.size() - 1) return false; if(oc.a[++index] == 0) return false; return true; } bool operator++(int) // Suffixversion { return operator++(); } // Operator -> überladen Obj* operator->() const { if(!oc.a[index]) { cout << "Nullwert"; return (Obj*)0; } return oc.a[index]; } }; int main() { const int sz = 10; Obj o[sz]; ObjContainer oc; for(int i = 0; i < sz; i++) { oc.add(&o[i]); } SmartPointer sp(oc); // Iterator erstellen do { sp->f(); // Aufruf des Smart Pointers sp->g(); } while(sp++); return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er die folgenden Ergebnisse:

10
12
11
13
12
14
13
15
14
16
15
17
16
18
17
19
18
20
19
21

C++ Operatorüberladung und Funktionsüberladung

Weitere Erweiterungen