Ansi C Operator überladen?



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • c.rackwitz schrieb:

    erlaeutere uns doch bitte deinen masterplan. was willst du mit der dickkoepfigkeit bezwecken?

    ich versuche einfach nur zu erklären, warum ich op-überladung für überflüssig halte:
    der nutzen ist klein.
    die möglichkeit schwer lesbaren code zu schreiben ist riesengross.
    aber wie schon gesagt: gegen selbst definierte ops, sofern sie sich im quelltext von eingebauten ops unterscheiden, habe ich nichts einzuwänden...
    🙂



  • pale dog schrieb:

    rüdiger schrieb:

    Warum sollte es einen syntaktischen Unterschied geben, wenn ich zwei Integer addiere oder zwei Bignums?

    ja, aber da hast du wirklich die einzig sinnvolle anwendung hervorgekramt 😉
    doch wie sieht's in der realität aus? op-überladung (+) wird z.b. genommen, um strings zusammenzufügen (wobei das ist noch nicht mal des schlechteste beispiel).
    aber echt übel: denk doch mal an C++ iostreams, wie da die shift-operatorn missbraucht werden.
    *das* ist richtig mies!

    Das Einzige? o_0

    * Klassen fuer reelle Zahlen
    * Klassen fuer Vektoren
    * Klassen fuer Matrizen
    ....

    Und das waren jetzt nur die offensichtlichen Faelle. Warum verbieten wir nicht gleich Pointer, damit kann man ja echt richtig fiese Dinge tun. Oder verbieten, dass es mehr als eine return-Anweisung pro Funktion gibt... Oder noch besser, lass die Leute doch gleich mit Lego spielen, das ist wesentlich ungefaehrlicher o_0

    Nur weil irgendwer ein Konzept schlecht verwendet kannst du's doch nicht gleich verurteilen. Oder findest du Demokratie scheisse, nur weil in Italien mal Silvio Berlusconi gewaehlt wurde?



  • Blue-Tiger schrieb:

    Das Einzige? o_0

    * Klassen fuer reelle Zahlen
    * Klassen fuer Vektoren
    * Klassen fuer Matrizen

    wenn man z.b. eine vektoraddition auf papier schreibt, sieht man ja am pfeil über dem vektor oder an den klammern, dass das + eine vektoraddition ist. in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen. auch hier wäre es nicht weiter schlimm, da man ja 'VectorA = VectorB + VectorC;' schreiben könnte, also kein eindeutiger missbrauch von op-überladung (aber nur wenn man aussagekräftige bezeichner wählt).
    🙂



  • pale dog schrieb:

    ...es ist nur 'syntaktischer zucker', also nichts, was man beim programmieren wirklich vermissen würde.
    🙂

    Nicht ganz ! Durch die "Überladbarkeit" von Operatoren können "primitive Typen" gleich behandelt werden wie Klassen (Ausnahme: Man kann von ihnen nicht ableiten).
    Übrigens: Die freie Wahl der Funktionsnamen führt mindestens zu ebensoviel Verwirrung.

    class A {
       int i;
    public:
       int get() { i = 7; return 5; }
       void set(int a) { outFile << a; }
    };
    

    (oder für ein etwas tiefsinnigeres Beispiel: Schau Dir mal die Bedeutungen von size(), lenght(), empty(), clear() in der STL an)

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Übrigens: Die freie Wahl der Funktionsnamen führt mindestens zu ebensoviel Verwirrung.

    class A {
       int i;
    public:
       int get() { i = 7; return 5; }
       void set(int a) { outFile << a; }
    };
    

    klar, aber ich kann es erkennen, wenn ich den code sehe:
    - die get-funktion setzt i immer auf 7 und gibt immer 5 zurück.
    - die set-funktion shiftet eine variable 'outFile' um 'a' bits nach links.
    die funktionen tun also nicht das, was man bezüglich ihrer namen von ihnen erwarten würde.
    hättest du aber einen der operatoren, das = oder das << überladen, dann würde man schon weniger aussagen über den code machen können:
    - die get-funktion gibt immer 5 zurück
    alles andere bliebe im dunkeln.
    🙂



  • pale dog schrieb:

    man kann damit sehr leicht unlesbaren code erzeugen und es ist nur 'syntaktischer zucker', also nichts, was man beim programmieren wirklich vermissen würde.

    Du siehst die Sache genau falsch herum. SZ, und im besonderen Op-Überladung, ermöglicht die Erzeugung von lesbarerem Code, dafür ist die Sache nämlich da.

    Würdest du Operatoren für int s etc. auch "nicht wirklich vermissen"?



  • pale dog schrieb:

    in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen.

    Das mag für dich so aussehen. Ich sehe da einen operator+ und einen operator=, und weiß, was das bedeuten kann.

    Kann es sein, dass deine Verwirrung einfach nur durch diese verschobene Wahrnehmung verursacht wird, möglicherweise weil du sehr lange mit einer Sprache zu tun hattest, die keine Operatorüberladung kennt?



  • pale dog schrieb:

    es gibt den '+' operator schon, er tut genau das, was man von ihm erwartet: addieren.

    Nur funktioniert er für Matrizen nicht.

    EDIT: Oh, da war ja noch ne Seite. *peinlich*



  • pale dog schrieb:

    rüdiger schrieb:

    Warum sollte es einen syntaktischen Unterschied geben, wenn ich zwei Integer addiere oder zwei Bignums?

    ja, aber da hast du wirklich die einzig sinnvolle anwendung hervorgekramt 😉
    doch wie sieht's in der realität aus? op-überladung (+) wird z.b. genommen, um strings zusammenzufügen (wobei das ist noch nicht mal des schlechteste beispiel).
    aber echt übel: denk doch mal an C++ iostreams, wie da die shift-operatorn missbraucht werden.
    *das* ist richtig mies!

    Eigentlich machen die Shift-Operatoren für die Streams sogar sehr viel sinn, aber du bist dafür eh nicht offen, deshalb spare ich mir die Zeit für eine Erklärung.



  • pale dog schrieb:

    Simon2 schrieb:

    Übrigens: Die freie Wahl der Funktionsnamen führt mindestens zu ebensoviel Verwirrung.

    class A {
       int i;
    public:
       int get() { i = 7; return 5; }
       void set(int a) { outFile << a; }
    };
    

    klar, aber ich kann es erkennen, wenn ich den code sehe:
    - die get-funktion setzt i immer auf 7 und gibt immer 5 zurück.
    - die set-funktion shiftet eine variable 'outFile' um 'a' bits nach links.
    die funktionen tun also nicht das, was man bezüglich ihrer namen von ihnen erwarten würde.
    hättest du aber einen der operatoren, das = oder das << überladen, dann würde man schon weniger aussagen über den code machen können:
    - die get-funktion gibt immer 5 zurück
    alles andere bliebe im dunkeln.
    🙂

    Quark.

    class A {
       int i;
    public:
       int operator-() { i = 7; return 5; }
       void operator+(int a) { outFile << a; }
    };
    

    Und was hat sich jetzt geändert?



  • pale dog schrieb:

    wenn man z.b. eine vektoraddition auf papier schreibt, sieht man ja am pfeil über dem vektor oder an den klammern, dass das + eine vektoraddition ist.

    So ein Unfug. Nur weil man das in der Schule so macht ist es noch lange nicht Gang und Gebe. Für Mathematiker gibt es da syntaktisch keinen Unterschied (will heißen, x ist auch ohne besondere Auszeichnung ein Vektor, wenn das vorher so definiert wurde).



  • pale dog schrieb:

    in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen.

    Und warum interessiert es mich ob ich gerade zwei primitive oder zwei nicht primitive Objekte addiere? Mich interessiert doch nur, dass die Addition statt findet.



  • rüdiger schrieb:

    Und warum interessiert es mich ob ich gerade zwei primitive oder zwei nicht primitive Objekte addiere? Mich interessiert doch nur, dass die Addition statt findet.

    Genau das war ja das Argument: Was man addiert ist nicht fraglich, fraglich ist nur, ob man addiert!

    Abgesehen davon halte ich die Debatte für sinnlos. Wieso gehen bei "Das ist gut/Das ist schlecht?"-Argumentationen die Contra immer davon aus, der Programmierer wäre zu blöd, überhaupt Quellcode zu lesen, und Pro immer davon aus, der Programmierer könnte jeden Quellcode lesen?



  • ich gehe davon aus das es ein mächtiges werkzeug ist

    wie jedes mächtige werkzeug hat es sowohl vorteile als auch nachteile

    diese entwickeln sich je nach nutzung und sorgfalt
    daher ist es überaus sinnvoll das ganze mit vorsicht zu geniesen,
    aber nicht generell zu verteufeln nur weil es den programmierertyp "codemonkey" überfordert



  • Reyx schrieb:

    rüdiger schrieb:

    Und warum interessiert es mich ob ich gerade zwei primitive oder zwei nicht primitive Objekte addiere? Mich interessiert doch nur, dass die Addition statt findet.

    Genau das war ja das Argument: Was man addiert ist nicht fraglich, fraglich ist nur, ob man addiert!

    Das gleiche kann man aber auch über einer add() Methode sagen. Weshalb dieser Aspekt doch gar keiner Argumentation bedarf. Denn hier unterscheiden sich eine Methode oder ein überladener Operator nicht.



  • MFK schrieb:

    pale dog schrieb:

    in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen.

    Das mag für dich so aussehen. Ich sehe da einen operator+ und einen operator=, und weiß, was das bedeuten kann.

    und woher?

    MFK schrieb:

    Kann es sein, dass deine Verwirrung einfach nur durch diese verschobene Wahrnehmung verursacht wird, möglicherweise weil du sehr lange mit einer Sprache zu tun hattest, die keine Operatorüberladung kennt?

    in der tat, dieser thread startete ja als 'op-überladung in C', was ja bekannterweise dieses zweifelhafte feature nicht hat. weil ich nun mal die meiste zeit in C code, kommt mir op-überladung fremd und blödsinnig vor. in anderen sprachen, in denen gang und gebe ist, dass man sich neue op's definiert, mag das nicht der fall sein. man muss eben immer darauf achten in welcher umgebung man sich befindet. als 3-dimensionales wesen bist du in einem raum ohne türen eingeschlossen. kannst du aber vierdimensional agieren, spazierst du einfach nach draussen. 😉

    lolz schrieb:

    pale dog schrieb:

    Simon2 schrieb:

    Übrigens: Die freie Wahl der Funktionsnamen führt mindestens zu ebensoviel Verwirrung.

    class A {
       int i;
    public:
       int get() { i = 7; return 5; }
       void set(int a) { outFile << a; }
    };
    

    klar, aber ich kann es erkennen, wenn ich den code sehe:
    - die get-funktion setzt i immer auf 7 und gibt immer 5 zurück.
    - die set-funktion shiftet eine variable 'outFile' um 'a' bits nach links.
    die funktionen tun also nicht das, was man bezüglich ihrer namen von ihnen erwarten würde.
    hättest du aber einen der operatoren, das = oder das << überladen, dann würde man schon weniger aussagen über den code machen können:
    - die get-funktion gibt immer 5 zurück
    alles andere bliebe im dunkeln.
    🙂

    Quark.

    class A {
       int i;
    public:
       int operator-() { i = 7; return 5; }
       void operator+(int a) { outFile << a; }
    };
    

    Und was hat sich jetzt geändert?

    genau das, was ich die ganze zeit anprangere: die bedeutung von + und - wird auf's übelste verfälscht!

    rüdiger schrieb:

    pale dog schrieb:

    in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen.

    Und warum interessiert es mich ob ich gerade zwei primitive oder zwei nicht primitive Objekte addiere? Mich interessiert doch nur, dass die Addition statt findet.

    dich interessiert nicht die wirkung der addition bzw. was sich dahinter verbirgt? ich finde schon, dass man es wissen sollte, wenn man es richtig anwenden will. wie willst du sonst z.b. fehlern auf die schliche kommen, wenn du einen wichtigen teil des codes nicht verstehst?



  • Reyx schrieb:

    rüdiger schrieb:

    Und warum interessiert es mich ob ich gerade zwei primitive oder zwei nicht primitive Objekte addiere? Mich interessiert doch nur, dass die Addition statt findet.

    Genau das war ja das Argument: Was man addiert ist nicht fraglich, fraglich ist nur, ob man addiert!

    Und welchen Vorteil bringt dann

    a.add(b);
    

    da weiß ich ja auch nicht ob der addiert.

    pale dog schrieb:

    rüdiger schrieb:

    pale dog schrieb:

    in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen.

    Und warum interessiert es mich ob ich gerade zwei primitive oder zwei nicht primitive Objekte addiere? Mich interessiert doch nur, dass die Addition statt findet.

    dich interessiert nicht die wirkung der addition bzw. was sich dahinter verbirgt? ich finde schon, dass man es wissen sollte, wenn man es richtig anwenden will. wie willst du sonst z.b. fehlern auf die schliche kommen, wenn du einen wichtigen teil des codes nicht verstehst?

    Und wieder: Wo ist der Unterschied zwischen einer Methode add und einem operator+ ?

    Und die Wirkung und was sich dahinter verbirgt sind zwei verschiedene Dinge. Mich interessiert erst einmal die Wirkung. Egal ob bei einem Operator oder einer Methode.



  • pale dog schrieb:

    lolz schrieb:

    pale dog schrieb:

    Simon2 schrieb:

    Übrigens: Die freie Wahl der Funktionsnamen führt mindestens zu ebensoviel Verwirrung.

    class A {
       int i;
    public:
       int get() { i = 7; return 5; }
       void set(int a) { outFile << a; }
    };
    

    klar, aber ich kann es erkennen, wenn ich den code sehe:
    - die get-funktion setzt i immer auf 7 und gibt immer 5 zurück.
    - die set-funktion shiftet eine variable 'outFile' um 'a' bits nach links.
    die funktionen tun also nicht das, was man bezüglich ihrer namen von ihnen erwarten würde.
    hättest du aber einen der operatoren, das = oder das << überladen, dann würde man schon weniger aussagen über den code machen können:
    - die get-funktion gibt immer 5 zurück
    alles andere bliebe im dunkeln.
    🙂

    Quark.

    class A {
       int i;
    public:
       int operator-() { i = 7; return 5; }
       void operator+(int a) { outFile << a; }
    };
    

    Und was hat sich jetzt geändert?

    genau das, was ich die ganze zeit anprangere: die bedeutung von + und - wird auf's übelste verfälscht!

    Bei operator- und operator+ wird also aufs übelste verfälscht. Aber die Methoden set und get nicht?



  • set() und get() sind wesentlich abstraker. Man weiß, dass etwas gesetzt oder abgerufen wird, mehr nicht. Dies sollte zutreffen, sofern der Programmierer nicht bewusst Mist baut. operator+ und operator- sind interpretationsabhängig, was ich aber nicht als Nachteil sehen würde.


Anmelden zum Antworten