C ++ Verschachtelte Klassen leiten Deklarationsfehler weiter

7

Ich versuche eine Klasse B innerhalb einer Klasse A zu deklarieren und zu verwenden und definiere B außerhalb A.
Ich weiß, dass dies möglich ist, weil Bjarne Stroustrup verwendet dies in seinem Buch "Die Programmiersprache C ++" (Seite 293, zum Beispiel die String- und Srep-Klassen).

Das ist also mein minimaler Code, der Probleme verursacht

%Vor%

Dieser Code gibt die folgenden Kompilierungsfehler in g ++:

%Vor%

Ich habe versucht, mir die C ++ - FAQ anzuschauen, und der Schluss, den ich bekam, war hier und hier , aber
diese gelten nicht für meine Situation.
Ich lese das hier von hier aus, aber es löst mein Problem nicht.

>

Gcc und MSVC 2005 geben Compiler-Fehler auf diesem

    
xxxxxxx 21.11.2008, 23:39
quelle

4 Antworten

11

Definieren Sie den Konstruktor für A NACH der Definition von Struktur B.

    
Paul Sonier 21.11.2008, 23:44
quelle
15

Der Ausdruck c->i dereferenziert den Zeiger auf struct A::B , so dass an diesem Punkt im Programm eine vollständige Definition sichtbar sein muss.

Die einfachste Lösung besteht darin, den Konstruktor von A nichtlinear zu machen und nach der Definition von struct A::B einen Rumpf dafür anzugeben.

    
Charles Bailey 21.11.2008 23:42
quelle
7

Dies ist ein gutes Beispiel dafür, warum Sie Definitionen von Deklarationen getrennt halten möchten. Sie müssen die Reihenfolge der Dinge so ändern, dass der Konstruktor A::A() nach der Definition von struct A::B definiert wird.

%Vor%     
e.James 21.11.2008 23:52
quelle
1

Interessanterweise habe ich dasselbe Problem mit der Seite 293 ('11 .12 A String Class '), die im Stroustrup-Buch erwähnt wird, gemacht.

Das im gedruckten Buch angegebene Beispiel scheint fehlerhaft zu sein und bietet die folgenden Methoden als Inline, anstatt sie nach der Definition von struct Srep

zu definieren %Vor%

Ich habe ein wenig gegoogelt und die neueste Implementierung der String-Klasse des Autors gefunden, die hier verfügbar ist:    Ссылка

Er scheint es so modifiziert zu haben, dass diese Methoden nicht mehr inline sind, um das in diesem Thread erwähnte Problem zu vermeiden.

    
Conan the Fishmonger 19.10.2010 03:08
quelle