Stroustrup gibt in C ++ Language book an, dass die Reihenfolge der Definitionen in der Klasse keine Rolle spielt.
Tatsächlich:
Dies wird kompiliert. Trotz Fehlbestellung. Wie versprochen. So weit, so gut.
Dies kompiliert jedoch nicht:
%Vor%Dies scheint ein Widerspruch zu Stroustrups Versprechen der freien Ordnung in der Klasse zu sein. Stroutrup zitieren: "Eine Memberfunktion, die innerhalb einer Klasse deklariert wird, kann sich auf jedes Mitglied der Klasse beziehen, als ob die Klasse vollständig definiert wäre, bevor die Memberfunktionskörper berücksichtigt würden."
Kennt jemand eine Ref-to-Standard-Klausel, die C1 zulässt und C2 nicht zulässt? Ich bin neugierig, warum C2 nicht zugelassen wurde, während C1 erlaubt ist. Ist es ein Compilerfehler, der dem Standard vielleicht widerspricht?
Beachten Sie, dass die folgenden Kompilierungen (in VS2008) in Ordnung sind:
%Vor%Es gibt zwei Unterschiede zwischen Ihren beiden Beispielen. Der erste verwendet ein nicht deklariertes -Symbol innerhalb des body einer Funktion und der zweite einen nicht deklarierten -Typ in der -Signatur der Funktion.
Ich vermute, dass mein Beispiel und Ihr erstes Beispiel beide funktionieren, weil die Funktionskörper erst aufgelöst werden, nachdem die gesamte Klassendeklaration analysiert wurde. Die Funktionssignaturen müssen sinnvoll sein, sobald sie gefunden werden.
Die Reihenfolge der Definition spielt keine Rolle, aber die Reihenfolge der Deklaration.
In C ++ bedeutet eine Deklaration (grob gesagt) die "Art" oder den Typ eines Symbols:
class A;
- & gt; A ist von der Art "Klasse" void foo(int);
- & gt; foo ist eine Funktion, die ein int akzeptiert und nichts zurückgibt Eine Definition definiert jedoch vollständig, worauf sich das Symbol bezieht. Wie in C ist eine Definition auch eine Deklaration.
Schließlich, um die Gewässer noch weiter zu verwässern, wird manchmal für Benutzer-deklarierte Typen eine Definition benötigt (vollständiger Typ), während manchmal eine einfache Deklaration ausreicht ...
Nun, lassen Sie uns Ihr Problem überarbeiten, ich werde es anhand eines einfachen Beispiels mit C ++ 0x veranschaulichen:
%Vor% Wie Sie feststellen, wird A::foo
korrekt analysiert, während A::bar
nicht.
Das Problem kommt von der Tatsache, dass der Compiler "schummelt": Der Körper der Methode wird erst vollständig analysiert, wenn die Klasse vollständig analysiert wurde. Daher ist es in Ordnung, auf einen noch nicht deklarierten Typ / Attribut / Funktion in einem Funktionskörper zu verweisen, aber es ist nicht in Ordnung, in einer Funktionssignatur (Deklaration) darauf Bezug zu nehmen.
Man könnte sagen, dass für den Compiler der Code äquivalent ist zu:
%Vor% Stroustrup Satz ist "einfach", aber nicht unbedingt genau. Wenn Sie beispielsweise Inner
als Attribut verwenden, müssen Sie dieses vollständig definieren (nur vollständige Typen können als nicht statische Attribute verwendet werden), was weitere Probleme verursachen kann.
Obwohl man argumentieren könnte, dass Inner foo
eine Deklaration ist und daher nicht von Stroustrups Zitat abgedeckt wird.
Ich denke, das Versprechen der freien Ordnung innerhalb der Klasse wird gehalten, wenn Sie Deklaration und Definition aufteilen (in einen Header und eine Implementierungsdatei). Sobald Sie sie aufgeteilt haben, spielt die Reihenfolge wirklich keine Rolle mehr.
Tags und Links c++