Frage an c++, forward-declaration – Wie erkläre ich eine innere Klasse weiter? [Duplikat]

133

Mögliche Duplikate:
Forward-Deklaration von verschachtelten Typen / Klassen in C ++

Ich habe so eine Klasse ...

<code>class Container {
public:
    class Iterator {
        ...
    };

    ...
};
</code>

An anderer Stelle möchte ich einen Container :: Iterator als Referenz übergeben, aber die Header-Datei nicht einschließen. Wenn ich versuche, die Klasse weiterzuleiten, erhalte ich Kompilierungsfehler.

<code>class Container::Iterator;

class Foo {
    void Read(Container::Iterator& it);
};
</code>

Das Kompilieren des obigen Codes gibt ...

<code>test.h:3: error: ‘Iterator’ in class ‘Container’ does not name a type
test.h:5: error: variable or field ‘Foo’ declared void
test.h:5: error: incomplete type ‘Container’ used in nested name specifier
test.h:5: error: ‘it’ was not declared in this scope
</code>

Wie kann ich diese Klasse weiterleiten, damit ich die Header-Datei, die die Iterator-Klasse deklariert, nicht einfügen muss?

Ich habe eine Lösung gefundenVerknüpfung bitlixi

Deine Antwort

3   die antwort
1

Ich kenne keine Möglichkeit, genau das zu tun, was Sie wollen, aber hier ist eine Problemumgehung, wenn Sie bereit sind, Vorlagen zu verwenden:

<code>// Foo.h  
struct Foo
{
   export template<class T> void Read(T it);
};
</code>
<code>// Foo.cpp
#include "Foo.h"
#include "Container.h"
/*
struct Container
{
    struct Inner { };
};
*/
export template<> 
  void Foo::Read<Container::Inner>(Container::Inner& it)
{

}
</code>
<code>#include "Foo.h"
int main()
{
  Foo f;
  Container::Inner i;
  f.Read(i);  // ok
  f.Read(3);  // error
}
</code>

Hoffentlich kann dieses Idiom für Sie von Nutzen sein (und hoffentlich ist Ihr Compiler EDG-basiert und implementiert den Export;)).

20

Ich glaube nicht, dass die Deklaration der inneren Klasse für eine unvollständige Klasse funktioniert (denn ohne die Klassendefinition gibt es keine Möglichkeit zu wissen, ob es tatsächlich eine gibtist eine innere Klasse). Sie müssen also die Definition von Container mit einer vorwärts deklarierten inneren Klasse einfügen:

<code>class Container {
public:
    class Iterator;
};
</code>

Implementieren Sie dann in einem separaten Header Container :: Iterator:

<code>class Container::Iterator {
};
</code>

Dann #nur den Container-Header einbeziehen (oder sich keine Gedanken über Forward-Deklaration machen und einfach beides einbeziehen)

Gute Antwort, außer dem Teil in der Klammer im ersten Absatz. Das "Es gibt keine Möglichkeit zu wissen, ob es tatsächlich eine innere Klasse gibt" ist in diesem Zusammenhang nicht sinnvoll und es ist zweifelhaft, ob es zutreffend ist. Der Sinn einer Forward-Deklaration ist, dass Sie dem Compiler mitteilen, dass es eine Klasse (oder in diesem Fall eine innere Klasse) gibt. Ihre spezifische Aussage wäre für normale Klassen ebenso zutreffend und würde bedeuten, dass Sie nichts weiter deklarieren können. Loduwijk
117

Das ist einfach nicht möglich. Sie können eine verschachtelte Struktur nicht außerhalb des Containers weiterleiten. Sie können es nur innerhalb des Containers weiterleiten.

Sie müssen eine der folgenden Aktionen ausführen

Machen Sie die Klasse nicht verschachteltÄndern Sie Ihre Deklarationsreihenfolge so, dass die verschachtelte Klasse zuerst vollständig definiert wirdErstellen Sie eine gemeinsame Basisklasse, die sowohl in der Funktion verwendet als auch von der verschachtelten Klasse implementiert werden kann.
Die Tatsache, dass es unmöglich ist, eine verschachtelte Struktur außerhalb des Containers weiterzuleiten, scheint eine Einschränkung in C ++ zu sein, die möglich sein sollte. Recht? Gibt es einen Grund, warum dies nicht möglich ist? HelloGoodbye
Sie können friend verwenden, um dies zu umgehen, wenn Sie möchten. Erik Aronesty
Die Common Base Class ist die von mir am häufigsten verwendete Lösung. Coyote
@ Nikerboker Sie sagen, dass verschachtelte Klassen nicht weiter deklariert werden könnendraußen der Kontainer. Das Beispiel im Link deklariert in Vorwärtsrichtung eine verschachtelte Klasseinnerhalb der Definition des Containers, die ein anderes Szenario ist. Antonio Barreto

Verwandte Fragen