C ++ Verschachtelte Klassen Vorwärtsdeklaration Fehler
-
10-07-2019 - |
Frage
Ich versuche, eine Klasse B innerhalb einer Klasse A zu deklarieren und verwenden
und B definieren außerhalb A.
Ich weiß für eine Tatsache, dass dies möglich ist, weil Bjarne Stroustrup
verwendet diese „Die C ++ Programmiersprache“
in seinem Buch
(Seite 293, zum Beispiel der Streich- und Srep Klassen).
Das ist also mein minimal Stück Code, das Probleme
Ursachenclass A{
struct B; // forward declaration
B* c;
A() { c->i; }
};
struct A::B {
/*
* we define struct B like this becuase it
* was first declared in the namespace A
*/
int i;
};
int main() {
}
Dieser Code gibt die folgende Zusammenstellung von Fehlern in g ++:
tst.cpp: In constructor ‘A::A()’:
tst.cpp:5: error: invalid use of undefined type ‘struct A::B’
tst.cpp:3: error: forward declaration of ‘struct A::B’
Ich habe versucht, an dem C ++ FAQ zu schauen und dem genähert ich erhielt, war hier und hier aber
diese nicht auf meine Situation anwenden.
Ich auch von hier href="https://stackoverflow.com/questions/237064/c-nested-classes-driving-me-crazy"> lesen, aber es ist die Lösung nicht mein Problem.
Sowohl gcc und MSVC 2005 geben Compiler-Fehler auf diesem
Lösung
Definieren Sie den Konstruktor für A nach der Definition von struct B.
Andere Tipps
Der Ausdruck c->i
dereferenzieren die Zeiger auf struct A::B
so eine vollständige Definition an diesem Punkt im Programm sichtbar sein muss.
Die einfachste Lösung ist, den Konstruktor von A
nicht-inline zu machen und einen Körper für sie nach der Defintion von struct A::B
liefern.
Dies ist ein gutes Beispiel dafür, warum wollen Sie Definitionen getrennt von Erklärungen zu halten. Sie müssen die Ordnung der Dinge ändern, so dass der Konstruktor A::A()
nach der Definition von struct A::B
definiert ist.
class A
{
struct B;
B* c;
A();
};
struct A::B
{
int i;
};
A::A() { c->i; }
int main()
{
return 0;
}
Interessanterweise habe ich in das gleiche Problem mit der Seite 293 ('11 .12 A String-Klasse) erwähnte im Stroustrup Buch gestoßen.
Das Beispiel in dem gedruckten Buch vorgesehen scheint Schuld zu sein, die folgenden Methoden als Inline-Bereitstellung, anstatt sie nach der Definition von struct Srep definieren
class String {
// ...
void check(int i) const { if (i<0 || rep->sz <=i) throw Range(); }
char read(int i) const { return rep->s[i]; }
void write(int i, char c) { rep=rep->get_own_copy(); rep->s[i]=c; }
...etc...
gegoogelt ich ein wenig und fand die neueste Umsetzung dieser String-Klasse des Autors finden Sie hier: http://www2.research.att.com/~bs/string_example.c
Er scheint es geändert zu haben, so dass diese Methoden nicht mehr inline, das Problem in diesem Thread erwähnt zu vermeiden.