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?


  • Mod

    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 as struct 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 gut

    Gruß,
    CSpille


Anmelden zum Antworten