Probleme beim Verlinken (Typneudefinition)



  • Ich habe gerade ein Problem beim Verlinken, bekomme gerade immer den Fehler "Typneudefinition".

    So mein Aufbau bisher (jede *.h hat natürlich dazugehörige *.cpp, die diese wieder includet)

    engine.h
    include player.h
    include field.h

    main.cpp
    include mainwin.h

    mainwin.h
    include fieldwin.h

    fieldwin.h
    include engine.h

    Jetzt hätte ich gerne eine weitere Header, in der die engine.h ebenfalls per include drin ist, dabei kommt es aber zur Typneudefinition.
    Wie kann ich das sonst aufbauen?
    Steh gerade ziemlich auf dem Schlauch 😞



  • Sorry, hab extra mit Tabs gemacht, aber die hat es wohl nicht übernommen...

    Müsste aber trotzdem klar sein.

    Vielen Dank für die Hilfe!



  • Benutzt du Include-Guards? Die dienen dazu, dass ein Header nicht mehrfach eingebunden wird. Zum Beispiel für die Datei foo.h:

    #ifndef FOO_H
    #define FOO_H
    
    //Hier der normale Header
    
    #endif
    

    Falls du das schon gemachst hast, wäre mehr Code vielleicht sinnvoll.

    Felix



  • Ich denke eher, dass er einen Linkerfehler erhält, weil das gleiche Symbol mehrfach definiert ist.

    Merke dir eins: In Header kommen Deklarationen, in die Implementationsdatei die zugehörigen Definitionen. Folgendes Beispiel soll die Sache verdeutlichen. Wenn du es nicht nachvollziehen kannst, informier dich genauer über modulare Programmierung in C++.

    // Header
    void Function(int x, double y);
    
    class MyClass
    {
        short Method();
    };
    
    extern float Var;
    
    // CPP-Datei
    void Function(int x, double y)
    {
        // ...
    }
    
    short MyClass::Method()
    {
        // ...
    }
    
    float Var = 3.21f;
    


  • Nexus schrieb:

    Ich denke eher, dass er einen Linkerfehler erhält, weil das gleiche Symbol mehrfach definiert ist.

    Nope!

    Das von Phoemuex war der richtige Ansatz!
    Thx! 👍



  • Nexus schrieb:

    // Header
    void Function(int x, double y);
    
    class MyClass
    {
        short Method();
    };
    
    extern float Var;
    

    [cpp]

    Wobei du das letzte Beispiel besser weggelassen hättest - globale Variablen sind selten (oder nie) gut und sollten in so einem allgemeinen Kontext nicht propagiert werden.


Anmelden zum Antworten