enum - wer hat Recht? Compiler oder Buch ;)



  • Das Beispiel steht so im Buch und der Autor spricht in diesem Zusammenhang von der Überladung des ~ Operators?



  • Das Beispiel steht nicht im Buch - der Autor spricht von der Überladung des ~ Operators - nicht von der Überladung des ~-Zeichens, aber das ist jetzt nur unsinnige Haarspalterei



  • Vertexwahn schrieb:

    Das Beispiel steht nicht im Buch - der Autor spricht von der Überladung des ~ Operators - nicht von der Überladung des ~-Zeichens, aber das ist jetzt nur unsinnige Haarspalterei

    Nein. Der Autor hat vollkommen Recht. ~ ist ein Operator, genauer gesagt ein unärer Operator. Siehe dazu ISO/IEC 14882:2003(E) - 5.3.1 Unary operators.



  • ~ ist ein Operator, genauer gesagt ein unärer Operator.

    das bestreitet auch niemand 😉



  • Nunja, es kam aber so rüber, dass dich das stören würde.

    Vertexwahn schrieb:

    der Autor spricht von der Überladung des ~ Operators - nicht von der Überladung des ~-Zeichens



  • Wenn ich den ~-Operator überladen will dann mache ich folgendes:
    operator~()

    Ein Destruktor stellt keine Überladung des ~-Operators, sondern nur eine Überladung des ~-Zeichens dar



  • Vertexwahn schrieb:

    Ein Destruktor stellt keine Überladung des ~-Operators, sondern nur eine Überladung des ~-Zeichens dar

    Ein dtor stellt überhaupt keine Überladung dar. Weder des ~ Operators noch des ~ Zeichens. 😉



  • Das kommt darauf an, ob man die Überladung als Konzept oder aus Sicht der Programmiersprache sieht - aber immerhin hast du eingesehen, dass ein Destruktor keine Überladung des ~-operators darstellt



  • Ich sollte wohl nochmal was dazu sagen. Überladen heißt allgemein, dass ein Symbol in unterschiedlichen Kontexten verschiedene Bedeutungen hat, so wie das ~ mal den Destruktor anzeigt und mal den Bitkomplementoperator darstellt.



  • Bashar schrieb:

    Überladen heißt allgemein, dass ein Symbol in unterschiedlichen Kontexten verschiedene Bedeutungen hat

    komisch, ich kenne überladen nur im zusammenhang mit funktionsnamen. du würdest also sagen, das symbol "stuhl" ist überladen, weil es die unterschiedlichen begriffe sitzmöbelstuhl und kackestuhl bedeutet? kannst du mir textbeispiele zeigen, wo das wort "überladung" so allgemein gebraucht wird? ich hab's nämlich noch nie gehört, daß man einzelne eichen, die teil eines namens sind, überladen nennt, nur weil sie in verschiedenen namen vorkommen.
    wenn du sagst
    ~Klasse()
    und
    operator~()
    würde ~ überladen, dann sage ich mit gleicher berechrigung
    Volkard
    und
    Vogelsberg
    würde das V überladen.
    ich hoffe, du mißtraust meiner V-überladung. ich sehe keinen untersachied zu deiner ~-überladung.



  • @Volkard

    komisch, ich kenne überladen nur im zusammenhang mit funktionsnamen

    siehe erklärung von Bashar - ich meine das gleiche

    ansonsten kann ich mich nur noch mal wiederholen:

    Wenn ich den ~-Operator überladen will dann mache ich folgendes:
    operator~()

    Ein Destruktor stellt keine Überladung des ~-Operators, sondern nur eine Überladung des ~-Zeichens dar



  • volkard schrieb:

    komisch, ich kenne überladen nur im zusammenhang mit funktionsnamen. du würdest also sagen, das symbol "stuhl" ist überladen, weil es die unterschiedlichen begriffe sitzmöbelstuhl und kackestuhl bedeutet? kannst du mir textbeispiele zeigen, wo das wort "überladung" so allgemein gebraucht wird?

    Nicht direkt, und auch nicht auf deutsch. Ein paar Sachen, die ich so gelesen habe: das static-Keyword sei überladen mit vier verschiedenen Bedeutungen; die Klammern sind in C überladen, weil sie auch für den Cast-Operator benutzt werden; die arithmetischen Operatoren sind in C überladen, weil sie je nach Typ eine andere Semantik haben. Das hat alles nichts mit Überladen als Feature einer Sprache zu tun. Ich gebe zu, dass das ein bisschen vage ist, und ich würde das auch nicht als normalen Sprachgebrauch bezeichen. Nur dass es nicht völlig plem-plem ist, zu behaupten, das ~ sei überladen.

    BTW@Vertexwahn, der Destruktor ist nicht die Überladung! Die Überladung ist der Zustand, dass das Zeichen in mehreren Bedeutungen vorkommt.



  • Vertexwahn, der Destruktor ist nicht die Überladung! Die Überladung ist der Zustand, dass das Zeichen in mehreren Bedeutungen vorkommt.

    das war mit

    myself schrieb:

    Ein Destruktor stellt keine Überladung des ~-Operators, sondern nur eine Überladung des ~-Zeichens da

    gemeint - habs halt nicht so schön formulieren können 😉



  • Vertexwahn schrieb:

    Das kommt darauf an, ob man die Überladung als Konzept oder aus Sicht der Programmiersprache sieht - aber immerhin hast du eingesehen, dass ein Destruktor keine Überladung des ~-operators darstellt

    Wieso eingesehen? Ich habe nie etwas dergleichen gesagt. Du hingegen glaubst, der Autor hätte das behauptet, aber bisher keine Beweise dafür gebracht. Vielleicht solltest du das nächste mal besser lesen, bevor du dich darüber lustig machst. 😉

    Vertexwahn schrieb:

    das war mit

    myself schrieb:

    Ein Destruktor stellt keine Überladung des ~-Operators, sondern nur eine Überladung des ~-Zeichens da

    gemeint - habs halt nicht so schön formulieren können 😉

    Dann schreib es das nächste Mal nicht so zweideutig. ZB hättest du "weitere Verwendung" statt dem Wort Überladung nehmen können. Ein dtor steht jedenfalls in keiner Beziehung zu einer Überladung, auch nicht vom ~ Zeichen. Was Überladung in C++ bedeutet, kannst du im Standard nachlesen. ➡ Kapitel 13



  • Wieso eingesehen?

    Darum:

    groovemaster schrieb:

    Vertexwahn schrieb:

    Das Beispiel steht nicht im Buch - der Autor spricht von der Überladung des ~ Operators - nicht von der Überladung des ~-Zeichens, aber das ist jetzt nur unsinnige Haarspalterei

    Nein. Der Autor hat vollkommen Recht. ~ ist ein Operator, genauer gesagt ein unärer Operator. Siehe dazu ISO/IEC 14882:2003(E) - 5.3.1 Unary operators.

    Ich hab verstanden, dass du der Meinung bist, dass der Destruktor die Überladung des ~-Operators darstellt, was unsinn ist

    Du hingegen glaubst, der Autor hätte das behauptet, aber bisher keine Beweise dafür gebracht.

    Heute Abend tippe ich mal die Stelle ab 😉



  • Aus Buch:

    S. 239
    "Das vom Konstruktor dynamisch erzeugte Array soll bei Programmende aus dem Speicher gelöscht werden. Dies macht eine Elementmethoder [<-steht so im buch ;)], die als Destruktor, bezeichnet wird; er ist das Gegenstück zum Konstruktor. Er wird gekennzeichnet durch den überladenen Bit-Negationsoperator und das Schlüsselwort delete."

    hier gefällt mir das "überadenen Bit-Negationsoperator" nicht

    S. 241
    "Ein Destruktor hat die Form
    ~Typ()
    wobei hier der Bit-Negationsoperator (auch Bit-Komplement-Operator genannt) überladen wird"

    hier gefällt mir "überladen wird" nicht...



  • Er macht zwar den Eindruck, als würde er das meinen, was ich gesagt habe, aber wenn man in C++ von Operatorüberladung spricht, aber nicht Operatorüberladung meint, ist das zumindest mal grob irreführend.



  • am Buch gibts auch noch andere Sachen, die mich stören:
    Häufig wird behauptet, dass C99 und C++ keinen boolschen Datentyp kennen, was Unsinn ist.

    Auf Seite 84 steht:
    "Zu beachten ist, dass durch die Deklaration einer Pointervariablen noch
    kein Speicherplatz reserviert worden ist. Dies geschieht erst durch die
    Zuweisungen:"

    Variablendeklarationen sind immer auch Definitionen es sei denn, der
    Deklaration ist ein extern vorangestellt.

    D. h. der Name einer Zeigervariablen wird bei einer Deklaration immer mit
    einem Speicherplatz verbunden.Oder war damit gemeint, dass ein Zeiger nach
    seiner Definition nicht mit einen sinnvollen Wert belegt ist...? Sollte man
    vielleicht in der nächsten Auflage ändern.

    S. 105 ist in der Übung 6.1 eine Klammer zuviel! Todesstrafe! Wenn etwas in einem Buch nicht passieren darf, dann ist es ein Klammer zuviel! *g*
    <<(p-(p-7)));
    müsste heißen:
    <<(p-(p-7));

    Das Bild auf Seite 120 (Abb. 7.4 Call by Reference) ist etwas verwirrend - als Leser erwarten man Links den Anfangszustand und rechts den Endzustand. Dann hätte man rechts für a den Wert 1202 und für b 1200. Der bidirektionale Pfeil der das vertauschen Der Werte darstellt kann missverstanden werden.

    Auf Seite 130 steht: "Ebenso wenig können Felder der Speicherklasse auto in C initialisiert werden; dies ist nur bei der Speicherklasse static möglich."
    Nach dem aktuellen Standard ist das nicht mehr so – Felder kommen immer gleich auch initialisiert werden

    S. 141: "Neu in der Norm ist der einstellige +-Operator. Mit seiner Hilfe kann bei gleichberechtigten Operatoren eine bestimmte Reihenfolge erzwungen werden. Soll im Term ab/c zuerst die Division ausgeführt werden, kann man schreiben:
    a
    +(b/c)
    Hier erscheint die Reihenfolge trivial, ist es aber in komplexeren Fällen nicht."

    man hätte das gleiche Ergebnis auch mit a*(b/c) erreicht...
    ich hab das mit dem einstelligen +-Operator zum ersten mal gehört - ich glaube irgendwie, dass sich das der Autor nur einbildet...

    S. 143: „Obwohl C/C++ keine expliziten BOOLEschen Variablen kennt“
    Nach aktuellen C und C++ Standard gibt es einen Booleschen Typ

    S. 170:
    „#include <iostream>
    using namespace std;
    enum wert {sieben,acht,neun,bube,dame,koenig,zehn,as};
    enum farbe {karo,herz,pik,kreuz};
    int main()
    {
    for (farbe f=karo; f<=kreuz; f++)
    for (wert w=sieben; w <= as; w++)
    {
    switch(f)
    {
    case karo : cout<< "Karo";break;
    case herz : cout<< "Herz";break;
    case pik : cout<< "Pik";break;
    case kreuz : cout<< "Kreuz";break;
    }
    switch(w)
    {
    case sieben: cout<< "-Sieben\n"; break;
    case acht: cout<< "-Achter\n"; break;
    case neun: cout<< "-Neuner\n"; break;
    case bube: cout<< "-Bube\n"; break;
    case dame: cout<< "-Dame\n"; break;
    case koenig: cout<< "-Koenig\n"; break;
    case zehn: cout<< "-Zehner\n"; break;
    case as: cout<< "-As\n"; break;
    }}
    return 0;
    }“

    Das Beispiel funktioniert nicht weil die +-Operatoren der enums nicht überladen sind

    S. 234: „Auch der Cast oder Typumwandlungs-Operator double soll so überladen werden, sich er den Dezimalwert des Bruchs ergibt:“

    Satzbau?

    S. 241
    „Es [CopyCtor] wird in folgenden drei Fällen aufgerufen…“

    Wird auch z. B. bei throw Exception() aufgerufen – ich wäre vorsichtig mit solchen Aussagen, wann genau der CopyCtor aufgerufen wird

    S. 239
    "Das vom Konstruktor dynamisch erzeugte Array soll bei Programmende aus dem Speicher gelöscht werden. Dies macht eine Elementmethoder [<-steht so im buch ], die als Destruktor, bezeichnet wird; er ist das Gegenstück zum Konstruktor. Er wird gekennzeichnet durch den überladenen Bit-Negationsoperator und das Schlüsselwort delete."

    hier gefällt mir das "überadenen Bit-Negationsoperator" nicht

    S. 241
    "Ein Destruktor hat die Form
    ~Typ()
    wobei hier der Bit-Negationsoperator (auch Bit-Komplement-Operator genannt) überladen wird"

    hier gefällt mir "überladen wird" nicht...

    #include <iostream>
    using namespace std;

    class A
    {
    public:
    ~A()
    {
    cout<<"ich bin die Ueberladung des ~-Zeichens"<<endl;
    }

    void operator~()
    {
    cout<<"ich bin der ueberladene ~-Operator"<<endl;
    }
    };

    int main()
    {
    {
    A objekt;
    ~objekt;
    }
    cin.get();
    }

    Überladen heißt allgemein, dass ein Symbol in unterschiedlichen Kontexten verschiedene Bedeutungen hat, so wie das ~ mal den Destruktor anzeigt und mal den Bitkomplementoperator darstellt.

    Ein Destruktor stellt keine Überladung des ~-Operators, sondern nur eine Überladung des ~-Zeichens dar.



  • Oh je. 😃



  • Methoder?! 😮
    Wie heißt denn das Buch?


Anmelden zum Antworten