2017-02-12 1 views
5

Ich habe es schwer zu verstehen, die Erklärung von stroustrup für welche Schwierigkeiten man konfrontiert haben muss, wenn der Operator für '.' war erlaubt.Unfähigkeit, Dot zu überlasten. Operator in C++

Sehen Sie dieses Zitat von Bjarne Stroustrup:

Operator. (Punkt) könnte im Prinzip mit der gleichen Technik wie für -> überladen werden. Dies kann jedoch zu Fragen darüber führen, ob eine Operation für die Objektüberladung gedacht ist. oder ein Objekt, auf das verwiesen wird. Zum Beispiel:

class Y { 
public: 
    void f(); 
    // ... 
}; 

class X { // assume that you can overload . 
    Y* p; 
    Y& operator.() { return *p; } 
    void f(); 
    // ... 
}; 

void g(X& x) 
{ 
    x.f(); // X::f or Y::f or error? 
} 

Im obigen Beispiel, warum soll es keine Verwirrung, während x.f() Ausführung?

Y& operator.() { return *p; } 

Hier ist, was ich denke.

  1. Operator() auf x daher aufgerufen wird, nicht wahr obivous und intuitiv, dass Y& operator.()(return *p; } genannt werden sollte?
  2. Nach *p Rückkehr, die vom Typ Y-Objekt auf und daher Y::f() sollte schließlich (X::f() nicht)

Was ich in der Erklärung stroustup fehle genannt werden? Warum ist es nicht einfach?

+0

"daher sollte' Y :: f() 'endlich aufgerufen werden" Aber ist das nicht verwirrend für jemanden, der diesen Code liest? Normalerweise würde 'x.f()' das 'f'-Mitglied von' x' aufrufen, aber in diesem Fall passiert das nicht. –

+0

@ScottHunter Nun, wenn das Beispiel von Stroustrup ist und Verwirrung veranschaulichen soll, sollte es nicht verwirrend sein :)? – AlexD

+0

Diese [SO Frage] (http://stackoverflow.com/questions/520035/why-cant-you-overload-the-operator-in-c) spricht über das gleiche Problem. –

Antwort

Verwandte Themen