022
15.08.2003, 10:30 Uhr
virtual
Sexiest Bit alive (Operator)
|
Ich habs mal vereinfacht und stelle Dir viermal die gleiche Frage:
Zitat: |
0xdeadbeef postete Moment, moment. Der Reihe nach.
1.1 Das Geheimnisprinzip wird nicht verletzt. Aufrufe wie
C++: |
class A { int i; }; struct B : public A { int get(int x = i) { return x; } };
|
wären ebenso unzulässig wie
|
Na toll: also habe ich ein Sprachkonstrukt, welches mir Zugriff nur auf public Member Variablen erlaubt. Dumm nur, daß public Members aus OO Sicht ziemlicher unsinn sind und zu vermeiden sind. Weißt Du weshalb: Wegen geheimnisprinzip! Machen solche Dinge Deiner Meinung nach die Sprache einfacher?
Zitat: |
2. Der Code funzt schon nicht, weil zum Zeitpunkt der Deklaration von A B::doMethod nicht bekannt ist und B nicht von A abeleitet ist. Ein ähnlicher Code:
|
Witzbold, ich hätte von Dir schon die Transferleistung erwartet, daß man die Implementation von A in einer getrennten Datei hält, dies aber - um das Posting nicht ausufern zu lassen - bleiben läßt. Klar geht das auch jetzt, wie du gezeigt hast. Aber daß es geht, bedeutet ja nicht, daß es sinnvoll ist. Meine Meinung dazu ist, daß der Code dadurch noch Fehleranfälliger wird. Zumindestens müßt man sagen: this Als Defaultargument ist erlaubt, aber hüte Dich davor es in ctoren zu tun. Machen solche Dinge Deiner Meinung nach die Sprache einfacher?
Zitat: |
und diese ambiguous call-Probleme hast du auch jetzt schon, was den Konstruktor angeht, sogar ohne Mehrfachvererbung. Der Code
C++: |
struct A { A(){} }; struct B : public A { }; struct C : public B { C() : A() { } };
|
kompiliert nicht. Fehlermeldung:
Code: |
a.cpp: In constructor `C::C()': a.cpp:3: error: type `struct A' is not a direct base of `C'
|
|
Das ist nicht der Punkt: Dein Fehler ist ein ganz simpler C++ Fehler, der Kommt, wenn man nicht direkt den Konstruktor der directen Baisklasse aufruft. Das hat überhaput nix mit der Situation zu tun, die ich beschrieben habe: Wenn Du Dir das Ursprüngliche Beispiel mit der Mehrfachvererbung anschaust, wirst Du feststellen, daß eine Instanz der Klasse D zwei Instanzen von Klasse A enthält (Siehe Lehrbuch bzgl. Mehrfachvererbung.) Der Defaultparameter mit (A* = this) Kann daher nicht funktionieren => Ausnahmeregelung erforderlich. Machen solche Dinge Deiner Meinung nach die Sprache einfacher?
Zitat: |
3. Du hast drei überlagernde Kontexte. Wenn der Parameter übergeben wurde, nimmt er den. Ist das nicht der Fall, sucht er sich die Sachen, die er zum konstruieren braucht, aus dem Klassenkontext, und wenn er sie da nicht findet, im globalen. Wenn er sie überhaupt nicht findet --> Compilerfehler. Ich sehe nicht, was daran willkürlich ist, diese Scoping-Geschichte läuft doch so ziemlich überall auf die selbe Weise.
|
Leider geht dann aber so was:
C++: |
const int i;
class { public: void f(int x = i); public: // Verletzung geheimnisprinzip, hatten wir ja schon int i; };
|
So, wie C++ aufgebaut ist, muß Der Compiler als Defaultparameter das globale i nehmen. Dh das Beispiel uinetrscheidet sich von:
C++: |
const int i;
class { public: // Verletzung geheimnisprinzip, hatten wir ja schon int i; public: void f(int x = i); };
|
Ziemlicher Schrott würde ich sagen. Machen solche Dinge Deiner Meinung nach die Sprache einfacher? -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |