2016-07-29 15 views
0

Kann mir bitte jemand erklären, warum der überladene Operator -> für Klasse Foo nicht von einem Zeiger vom Typ Foo * aufgerufen wird?C++ überladener Operator ->() wird nicht aufgerufen?

#include <iostream> 
using namespace std; 

class Foo { 
public: 
Foo * operator ->() { 
    cout << "calling Foo * operator ->()\n"; 
    return this; 
} 
    int x; 
}; 


void main() { 
    Foo f; 
    Foo * pF = &f; 
    pF->x;     // Why is overloaded operator-> not being called here? 
    (pF->operator->())->x; // This works. 

    cout << "End test.\n"; 
} 
+0

Die zweite Anweisung funktioniert, weil Sie im Wesentlichen die Betreiber fordern -> Methode der Zeiger pF. Dort findet keine Überlastung statt. Wie unten beantwortet, können Sie Operatoren nur für Instanzen, die keine Zeiger sind, überladen. –

Antwort

6

Warum überlastet ist operator-> hier nicht genannt zu werden?

Da pF ein Zeiger ist, keine Foo Instanz. Sie haben operator-> für Foo, nicht Foo* überladen. Sie können Ihre überladenen operator-> direkt auf f anrufen.

f->x; 

können Sie die Überlastung von operator-> für Foo* oder einen anderen Zeigertyp.

+0

Nun, ich hoffe auf ein implizites virtuelles Adressensystem. Geben Sie dem Client ein Foo *, können Sie das Foo-Objekt im Speicher verschieben (Optimierung), lassen Sie Foo * immer noch auf das richtige Objekt zeigen. Sieht so aus, als hätte ich eine Smart-Pointer-Container-Klasse. –

3

Sie überladen es für Foo, nicht für Foo* (was unmöglich ist).

Dies würde gearbeitet haben:

(f.operator->())->x; 

Oder natürlich:

f->x; 

Die Möglichkeit, dass die kurze Syntax verwendet der gesamte Zweck der Überlastung ist, nicht wahr? Obwohl es ziemlich verwirrend ist, einen Zeiger auf dasselbe Objekt zu setzen, auf das Sie den Operator aufgerufen haben.

+0

Warum so umständlich anrufen? Warum nicht einfach "f-> x"? –

+0

@Revolver_Ocelot: Ja oder das. Ich wollte die Absicht des OP behalten, aber seinen direkten Fehler beheben. –

+0

@ HiI'mFrogatto: Nein. Der ganze Punkt von 'operator->' ist 'f-> x' zu machen lol –

2

Sie haben den "Point-to" -Operator vom Typ Foo überladen, nicht den Typ Foo*.

class Foo { 
public: 
    // Overload 'point-to' operator of 'Foo' 
    Foo * operator ->() { 
     cout << "calling Foo * operator ->()\n"; 
     return this; 
    } 
    int x; 
}; 

Anwendungsbeispiel:

Foo f; 
f.operator->(); 
Verwandte Themen