Methode aus Basisklasse aufrufen.



  • Aha, okay. Is aber eigentlich blöd gemacht, das man immer n neues "delete" machen muss. Das hätt sich der Erfinder mal besser überlegen sollen! Und des dümste is ja eigentlich, warum gibts dann kein Compilier Fehler? Weil des is doch einfach falscher Syntax oder?

    MfG
    Stromberg



  • Stromberg schrieb:

    Weil des is doch einfach falscher Syntax oder?

    Nein, das ist der Komma-Operator. Und wenn du den nicht kennst, ist das nicht die Schuld des "Erfinders".



  • Ja das verwirrt einen halt, weil sowas ist ja erlaubt:

    int *m_a, *m_b;
    


  • Das ist das selbe Problem wie das Verwechseln von Konstruktor- und Zuweisungsoperatoraufruf. Es gibt einerseits Deklaration und Definitionen und andererseits Ausdrücke.



  • MFK schrieb:

    Nein, das ist der Komma-Operator. Und wenn du den nicht kennst, ist das nicht die Schuld des "Erfinders".

    Sicher nicht die Schuld des Erfinders, aber besonders häufig wird er ja nicht erwähnt, erst recht nicht in kleineren Ich-lerne-C++-Büchern 🙂



  • Wo kann ich was über dne sog. "Komma Operator" finden?



  • Eigentlich gibt's über den recht wenig zu sagen. Er steht sehr weit unten in der Rangfolge (also um ihn sicher anzuwenden (zb in Funktionsaufrufen) musst du schon Klammern setzen), er kann überladen werden (was man aber aufgrund der Verwechslungsgefahr recht selten tut, und wenn, dann nur mit einem deutlichen Hinweis) und sein Standardverhalten ist, wie oben beschrieben.

    Im Prinzip wird der Kommaoperator auch immer nur auf zwei Elemente angewendet, also entspricht a, b, c dann ((a, b), c), was wiederum operator,(operator,(a, b), c) entspricht. Es werden beide Parameter ausgewertet und der Wert des rechten zurückgegeben.


  • Mod

    .filmor schrieb:

    Im Prinzip wird der Kommaoperator auch immer nur auf zwei Elemente angewendet, also entspricht a, b, c dann ((a, b), c), was wiederum operator,(operator,(a, b), c) entspricht. Es werden beide Parameter ausgewertet und der Wert des rechten zurückgegeben.

    Es muss unbedingt dazu gesagt werden, dass der Kommaoperator ebenso wie die Kurzschlußoperatoren && und || zunächst den linken Operanden auswertet und alle Seiteneffekte (abgesehen von der Zerstörung temporärer Objekte) abgeschlossen sind, bevor der rechte Operand ausgewertet wird. Er ist also ein "sequence point". Weil diese Eigenschaft beim Überladen verloren geht, sollte er in der Regel nicht überladen werden.

    P.S. Der Komma Operator steht nicht nur "sehr weit unten" sondern ganz unten in der Hierarchie - er hat die niedrigste Priorität aller Operatoren in C++

    P.P.S. Im Gegensatz zu den logischen Operatoren ist es leicht, um überladene Kommaoperatoren herumzucoden, wenn das notwendig ist: Es genügt, den linken Operanden nach void zu casten. Ein Ausdruck vom Typ void kann niemals Argument eines Funktionsaufrufes sein, folglich auch niemals den Aufruf eines überladenen Operators bewirken.



  • Aaaaaaah, deswegen der cast auf void in so vielen Makros 🙂
    Man kann damit aber wirklich ein paar ziemlich perverse Sachen machen:

    int* foo()
    {
    	int *a = new int(1), *b = new int(2);
    	return delete a, b;
    }
    


  • Also wenn ich soetwas mach, mache ich der übersichtlichkeit halber ne klammer rum, aber das ist doch noch keine über/fehlnutztung des kommaoperators. Man kann ihn da benutzten, wo man zu faul ist {klammern} zu öffnen, ...



  • Oder dort, wo man es nicht kann. Zb in einem for.


Anmelden zum Antworten