2016-10-01 3 views
0

In C++, wenn Sie haben eine Klasse Foo bekam, und Sie möchten, dass Benutzer von Foo der Lage sein, zu schreiben:Operator für primitive Typen in C Überlastung ++

Foo x; 
x += 3; 

, können Sie einfach eine Member-Funktion machen Foo, Foo& operator+=(int rhs). Wenn Sie in der Lage sein schreiben wollen:

Foo x; 
int y = 3; 
y += x; 

, können Sie nicht dies erreichen, indem eine Member-Funktion von Foo schreiben, stattdessen hat man eine externe Funktion zu schreiben, die in der Regel als Freund von Foo deklariert werden müssen.

Wie schwer wäre es für eine zukünftige Version von C++ zu sagen, dass diese mit Foo Member-Funktion geschrieben werden kann int& operator+=(int &lhs, Reversed), wo einige leere Klasse Reversed war, dessen einziger Zweck war es, die zwei Versionen des Betreibers zu unterscheiden?

Wenn dies getan würde, könnte es wahrscheinlich die überwiegende Mehrheit der Verwendungen des Schlüsselwortes friend im neuen Code beseitigen.

+0

ich glaube nicht, dass es in naher Zukunft eine Option. Es fühlt sich an wie eine zufällige Idee, Sie müssten die Regeln für "@ =" - Operatoren brechen. Ich würde rathed hinzufügen imaginären Stichwort, das sagt, dass "lhs" ist jetzt "rhs", aber die Frage ist "Warum?". Die aktuelle Syntax funktioniert gut und es hat keinen Sinn. Nun, warte 10 Jahre und sieh zu. – xinaiz

+0

@BlackMoses Sie können diese Operatoren bereits definieren. Es ist keine zufällige Idee. 'operatorXxx'-Methoden können auch für primitive Typen außerhalb einer Klasse definiert werden – msrd0

+0

@ msrd0 Inside Klassenkörper ohne Freundschaft zu deklarieren? EDIT: ok, falsch gelesen und gelesen. – xinaiz

Antwort

2

Sie können in der Tat so definieren, einen Operator, weil Sie frei sind +=, um eine Überlastung für integrierte Typen:

int& operator+=(int &lhs, Foo &rhs) { 
    lhs += rhs.somefield; 
    return lhs; 
} 

Auf der anderen Seite, statt für alle möglichen Betreiber überladene Funktionen schreiben, können Sie auch eine Funktion, die impliziten Abgüsse von class Foo zu int ermöglichen:

class Foo { 
    ... somefield; 

    operator int() { 
    return (int)somefield; 
    } 
}; 
+0

Dies wird nicht kompiliert: http://coliru.stacked-crooked.com/a/cc94493995f99088. Es ging darum, das Schlüsselwort friend nicht zu verwenden und den Operator im Klassenkörper zu deklarieren. P.S. Danke für die Korrektur G. Sliepen :) – xinaiz

+0

@BlackMoses Verschieben Sie den Operator außerhalb der Klasse und es wird ohne Probleme kompilieren – msrd0

+0

@BlackMoses http://coliru.stacked-crooked.com/a/2b0dfc19c005b6b1 – msrd0