Vorwärtsdeklaration
-
Hallo zusammen,
ich mache in der Regel lieber eine Vorwärtsdeklaration als den kompletten Header
der Datei zu includieren (Ausnahme: Standard-Bibliothek). Ich verwende
allerdings auch selten typedef.
Jetzt hab ich einen Typen der folgendermaßen deklariert ist:myheader.h
typedef std::vector<MyClass*> MyList;In einer Methode will ich dann eine Referenz auf ein solches Objekt als Parameter
haben:class Foo { // class MyList; void method(MyList& list); }Die angedeutete Vorwärtsdeklaration funct allerdings nicht:
'struct MyList' has a previous declaration as `struct MyList'Wie krieg ich sowas hin (ohne den Header zu inkludieren bzw. den typedef in
der Datei zu machen)?Wie kann ich eigentlich eine Vorwärtsdeklaration für einen std::vector
machen?Ich möchte nämlich später ne eigene Implementierung von MyList machen und
dann will ich nicht alles ändern.Gruß,
CSpille
-
Wenn die Kommentarzeichen // entfallen und noch die Klasse mit einem Semikolon abgeschlossen wird, ist das Programm so korrekt. D.h. der Ausschnitt ist wohl zu klein, um die Ursache des Fehlers sehen zu können. Ein Hinweis ist auch die Fehlermeldung, denn bei der Vorwärtsdeklaration muss eine vorherige Deklaration nicht sichtbar sein, man sieht sie im Beispiel auch nicht, aber der Compiler sieht sie,d.h. das Beispiel ist offensichtlich zu stark verkürzt.
-
Soweit ich weiß, ist es eine schlechte Idee, typedefs vorwärts zu deklarieren. Den Grund weiß ich nicht mehr... habe ich aber mal in einem Buch gelesen.
Haste mal inkludiert?
-
Ein typedef ist bereits nur eine Deklaration. Es ist nicht möglich, den typedef Namen auf einem anderen Weg einzuführen (insbesondere nicht etwas der Art struct MyList). Eine Möglichkeit wäre es, analog zu <ios_fwd>, den Header, der eigentlich für die Deklaration von MyList zuständig ist, durch einen Header, der nur Deklarationen enthält, zu ergänzen.
-
Vielen Dank für eure Antworten!
@Helpie: Das Semikolon war natürlich (hier) nen Flüchtigkeitsfehler und die
Vorwärtsdeklaration sollte auch vor der Klasse sein ^^
Naja, war halt schon spät
wegen des zu kleinen Code-Ausschnitts, poste ich mal ein komplett nicht
lauffähiges Programm:main.cpp:
#include "Foo.h" #include "MyList.h" int main(void){ Foo foo; MyList list; foo.method(list); return 1; }MyList.h:
#include <vector> class MyClass; typedef std::vector<MyClass*> MyList;MyClass.h:
class MyClass{ };Foo.h:
class MyList; //#include "MyList.h" class Foo { public: void method(MyList& list); };Foo.cpp:
#include "Foo.h" #include "MyList.h" #include "MyClass.h" void Foo::method(MyList& list){ list.push_back(new MyClass()); }Fehlermeldung:
2 D:\Projekte\Cpp\Test\main.cpp In file included from main.cpp
5 D:\Projekte\Cpp\Test\MyList.h conflicting declaration 'typedef class std::vector<MyClass*, std::allocator<MyClass*> > MyList'
2 D:\Projekte\Cpp\Test\Foo.h 'struct MyList' has a previous declaration asstruct MyList' D:\\Projekte\\Cpp\\Test\\main.cpp In functionint main()':
8 D:\Projekte\Cpp\Test\main.cpp no matching function for call to `Foo::method(MyList&)'
note D:\Projekte\Cpp\Test\Foo.h:7 candidates are: void Foo::method(MyList&)
D:\Projekte\Cpp\Test\Makefile.win [Build Error] [main.o] Error 1@Artchi: Danke für den Hinweis, dass es nicht empfehlenswert ist.
Jupp, mit Inkludierung funct es (Hatte ich auch schon probiert)@Camper: Die Idee mit dem Header, der nur die notwendigsten Deklarationen
enthält, finde ich gutGruß,
CSpille