Ich bin kürzlich in einer Situation wie dieser festgefahren:
class A
{
public:
typedef struct/class {...} B;
...
C::D *someField;
}
class C
{
public:
typedef struct/class {...} D;
...
A::B *someField;
}
Normalerweise können Sie einen Klassennamen deklarieren:
class A;
Sie können einen verschachtelten Typ jedoch nicht weiterleiten. Folgendes führt zu einem Kompilierungsfehler.
class C::D;
Irgendwelche Ideen?
c++
class
nested
forward-declaration
Calmarius
quelle
quelle
Antworten:
Sie können es nicht tun, es ist ein Loch in der C ++ - Sprache. Sie müssen mindestens eine der verschachtelten Klassen aufheben.
quelle
Ich brauchte eine Vorwärtsreferenz wie:
Meine Problemumgehung war:
Später, als ich die vollständige Definition verwenden konnte:
Diese Technik wäre wahrscheinlich schwieriger als es sich lohnt, wenn es komplizierte Konstruktoren oder andere spezielle Elementfunktionen gäbe, die nicht reibungslos vererbt würden. Ich könnte mir vorstellen, dass bestimmte Vorlagenmagie schlecht reagiert.
Aber in meinem sehr einfachen Fall scheint es zu funktionieren.
quelle
using basename::basename;
in der abgeleiteten Klasse erben , was bei komplizierten Ctoren kein Problem darstellt.typedef
innerhalb der Klasse zu verwendenWenn Sie wirklich vermeiden möchten, # die böse Header-Datei in Ihre Header-Datei aufzunehmen, können Sie dies tun:
HPP-Datei:
CPP-Datei
Aber dann:
Also, ja, Kompromisse ...
quelle
hpp
Datei?Dies kann erfolgen, indem die äußere Klasse als Namespace vorwärts deklariert wird .
Beispiel: Wir müssen eine verschachtelte Klasse other :: A :: Nested in Others_a.h verwenden, die außerhalb unserer Kontrolle liegt.
Andere_a.h
my_class.h
my_class.cpp
quelle
a::b
es auf die gleiche Weise entstellt wird, egal oba
Klasse oder Namespace.Ich würde dies keine Antwort nennen, aber dennoch einen interessanten Fund: Wenn Sie die Deklaration Ihrer Struktur in einem Namespace namens C wiederholen, ist alles in Ordnung (zumindest in gcc). Wenn die Klassendefinition von C gefunden wird, scheint sie den Namensraum C stillschweigend zu überschreiben.
quelle
Dies wäre eine Problemumgehung (zumindest für das in der Frage beschriebene Problem - nicht für das eigentliche Problem, dh wenn Sie keine Kontrolle über die Definition von haben
C
):quelle
Wenn Sie Zugriff haben, um den Quellcode der Klassen C und D zu ändern, können Sie die Klasse D separat herausnehmen und in Klasse C ein Synonym dafür eingeben:
quelle