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.
- Operator() auf x daher aufgerufen wird, nicht wahr obivous und intuitiv, dass
Y& operator.()(return *p; }
genannt werden sollte? - Nach
*p
Rückkehr, die vom Typ Y-Objekt auf und daherY::f()
sollte schließlich (X::f()
nicht)
Was ich in der Erklärung stroustup fehle genannt werden? Warum ist es nicht einfach?
"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. –
@ScottHunter Nun, wenn das Beispiel von Stroustrup ist und Verwirrung veranschaulichen soll, sollte es nicht verwirrend sein :)? – AlexD
Diese [SO Frage] (http://stackoverflow.com/questions/520035/why-cant-you-overload-the-operator-in-c) spricht über das gleiche Problem. –