OOP mal wieder


  • Mod

    schue schrieb:

    Ok, dann schreib doch gleich Bjarne ne email das er das in seinem Buch falsch dargestellt hat.

    Erstmal schau ich mir das Ganze am WE (hab das Buch grad nicht zur Hand) im Original an, möglicherweise ist das Zitat auch unvollständig. Welches Kapitel ist das? Bei Widersprüchen hat der Text des Standards allerdings grundsätzlich Vorrang vor irgendwelchen externen Quellen, selbst wenn sie von Stroustrup stammen.

    ISO/IEC 14882:2003 schrieb:

    12.1 Constructors [class.ctor]
    1 Constructors do not have names.

    Da ist einfach kein Interpretationsspielraum.



  • wenn konstruktoren keinen namen haben, wie erklärt sich dann die implementierungssyntax Klasse::Klasse(){}? auch als spezielles schlagwort?

    halte den auszug aus der ISO für daneben. klar haben konstruktoren einen namen, der sogar sehr wohl definiert ist.



  • Tut mir leid, aber einen Namen (für den Ctor), der 100% mit dem der Klasse übereinstimmen muss, kann ich beim besten Willen nicht als eigenen Namen ansehen. Demnach würde ich doch eher der Aussage des Standards folgen, dass Konstruktoren keinen Namen haben...

    Man könnte natürlich auch definieren dass ein Konstruktor als Namen den der Klasse hat (was ihn aber als "Eigennamen" im Sinne des Wortes disqualifiziert, weil er eben nicht frei definierbar ist). Was aber exakt aufs selbe hinausläuft.

    Worum geht's hier eigentlich? 😃



  • wtf schrieb:

    Artchi schrieb:

    Badestrand! Soweit fast richtig.

    Hier wird ebend gerade nicht der Ctor aufgerufen:

    Cl = new Cl; // Konstruktor
    

    Hier schon:

    Cl = new Cl(); // Konstruktor
    

    Artchi du enttäuscht mich zu tiefst!

    Stell dir vor, ich bin auch nur ein Mensch! 😃 😉


  • Mod

    thordk schrieb:

    wenn konstruktoren keinen namen haben, wie erklärt sich dann die implementierungssyntax Klasse::Klasse(){}? auch als spezielles schlagwort?

    Das wurde bereits dargestellt, aberr bitte:

    ISO/IEC 14882:2003 schrieb:

    12.1 Constructors [class.ctor]
    1 Constructors do not have names. A special declarator syntax using an optional sequence of functionspecifiers (7.1.2) followed by the constructor’s class name followed by a parameter list is used to declare or define the constructor.

    Der Standard spricht grundsätzlich und konsistent nur vom "constructor's class name". Im Übrigen ist die Annahme eines Namens für Konstruktoren noch aus einem anderen Grunde irrig. Sie würde das name lookup aushebeln. Da der Name einer Klasse in ihren Namensraum "injiziert" wird (9/2 Satz 2) hätten wir dann plötzlich den Namen eines Typs als auch eine (möglicherweise überladene) Funktion gleichen Namens im selben Scope. Diese Möglichkeit ist in der Aufzählung von 3.3/4 aber nicht enthalten.

    halte den auszug aus der ISO für daneben. klar haben konstruktoren einen namen, der sogar sehr wohl definiert ist.

    Du darfst davon halten, was du willst. Was nun normativ ist oder nicht, wird von deiner Haltung nicht bestimmt.



  • Es gibt sowas wie einen Unterschied zwischen einer technischen Spezifikation und dem Sprachgebrauch. Sicher stimmt es das ein Ctor keinen Namen im Sinne einer Funktion haben mag, aber wie soll ich denn in Zukunft folgenden Satz bilden, wenn ich versuche einem Anfänger zu erklären das der CTor den gleichen Namen wie die Klasse haben muß?

    Der [Zeichenkette die identisch mit dem Klassennamen ist] des CTors muß identisch mit dem Klassennamen sein.

    Vorschläge bitte...

    Gleichermassen verwissrend dürfte dann folgender Satz ausfallen: Der CTor hat keinen Namen muß aber nach der Klasse benannt werden.


  • Mod

    schue schrieb:

    Es gibt sowas wie einen Unterschied zwischen einer technischen Spezifikation und dem Sprachgebrauch. Sicher stimmt es das ein Ctor keinen Namen im Sinne einer Funktion haben mag, aber wie soll ich denn in Zukunft folgenden Satz bilden, wenn ich versuche einem Anfänger zu erklären das der CTor den gleichen Namen wie die Klasse haben muß?

    Das kannst du ja so tun, aber dann bitte nicht mit Zitaten von Stroustrup kommen, die den Anschein des Autoritären haben. Es genügt ja nicht, in einer Erklärung zu sagen, der Kontruktor hat den Namen der Klasse. Irgenwie muss da noch hin, dass kein Rückgabewert existiert - trotzdem schreiben wir kein void dahin. Es ist also sowieso eine spezielle Syntax gegeben. Und wenn wir statt dessen sagen, dass die Deklaration einer speziellen Syntax folgt, brauchen wir das Vehikel des Namens eigentlich von vornherein nicht.



  • "Der Konstruktor hat immer den Namen der Klasse und besitzt keinen Rueckgabetyp (auch nicht void)" --> ist doch ne gute Erklaerung fuer Anfaenger. leicht verstaendlich, leicht anwendbar. Dass der Standard das anders erklaert kann ja dann im spaeteren Verlauf erklaert werden.

    Jedenfalls fand ich eine solche Erklaerung als ich zum ersten Mal etwas von Konstruktor gehoert habe einleuchtend und hatte keine Probleme in der Anwendung.



  • Shinja schrieb:

    "Der Konstruktor hat immer den Namen der Klasse und besitzt keinen Rueckgabetyp (auch nicht void)" --> ist doch ne gute Erklaerung fuer Anfaenger....

    Aber nur solange, bis der Anfänger dazu kommt, was mit "Name" alles gemeint ist und gemacht wird ("name lookup", ....) ... spätestens dann muß er reinfallen und nochmal umlernen.

    Bei all den Ausnahmen (Konstruktoren werden auch nicht "vererbt" wie andere Methoden, werden bisweilen automatisch generiert und aufgerufen, sollten keine virtuellen Funktionen aufrufen, ....) wird der Sinn der Regel "Wie eine Funktion, außer ...." immer dünner.

    Konstruktoren sind einfach besondere Konstrukte, mit denen man sich besonders beschäftigen muß.

    Gruß,

    Simon2.



  • Anonymous schrieb:

    Noch vor fünf Jahren hätte ich auch der Aussage zugestimmt, daß man halt kleine Projekte ebenso gut in C schreiben kann, größere Sachen dann in C++. ...
    Interessanetrweise hat mich gerade ein einjähriger (beruflich bedingter) Ausflug in C# dazu gebracht über meinen C++ Stil nachzudenken....

    Ich würde sagen: Es kommt nicht auf die Länge an ! 😉

    Entscheidend für die Wahl des Paradigmas ist die Struktur der Aufgabenstellung. Es gibt Aufgaben, die können nicht besser als prozedural beschreiben werden ... und da sollte man auch prozedural programmieren. Ein "Mischmasch" klingt abwertender, als es ist .... ich würde einfach davon sprechen, dass prozedurale und "oo-tierte" Aufgaben ineinandergreifen.
    Es ein gleich großer Krampf,
    - in einem Umfeld mit sehr vielen voneinander unabhängigen "Komponenten" prozedural zu programmieren wie
    - für eine algorithmisch angelegte Aufgabe säckeweise interagierende Klassen anzulegen.

    Natürlich neigen "größere Sachen" eher dazu, viele Abhängigkeiten und Komponenten zu haben und "kleinere Sachen" verzeihen eher eine unscharfe Kapselung, aber das sind IMO nur Begleiterscheinungen/Hinweise und nicht Hauptkriterien.

    my2c

    Gruß,

    Simon2.


Anmelden zum Antworten