#include - sinnvolles "Verlinken" von Klassen und Funktionen



  • hi

    wie kann ich meine versch. Klassendefinitionen und Funktionen (jeweils verschiedene Dateien) sinnvoll verlinken? 😕

    Bsp.
    Ich habe CEdge.h / CEdge.cpp, diese Klasse wird von CVertex gebraucht. Die beiden werden von CGraph gebraucht. Dies alles muss irgendwie in CDijkstra includiert werden.
    (soweit bin ich noch gekommen, es gibt dann einfach eine "Schlange" von includes.)
    Die externe Funktion ReadFromTxt brauch die Klasse CGraph. Hier das Problem.

    Wie kann man das lösen? Ich habe schon von der Verwendung von "StdAfx.h/cpp" gehört. Wie funktiniert das / Ist das sinnvoll?

    Vielen Dank für eure Hilfe
    gruss nate



  • CVertex.h inkludiert CEdge.h. CGraph.h inkludiert CVertex.h. CDijkstra inkludiert CGraph.h und das Modul, dass ReadFromTxt definiert inkludiert CGraph.h (alles geschützt durch include-guards).
    StdAfx.h hat damit nichts zu tun und ist bloß ein MFC-Header.



  • interpreter schrieb:

    StdAfx.h ... ist bloß ein MFC-Header.

    Nö. StdAfx.h wird beim VC für die vorkompilierten Header benötigt und hat mit MFC nichts zu tun. Wenn man ein Konsolenprojekt anlegt ist der Header per default auch mit dabei.

    MfG Jester



  • wunderbar! so funkionierts!

    Allerdings finde ich das nicht besonders elegant. v.a. wenn da noch mehr Klassen dazukommen, gibt das einen rechten include-Salat..

    Gäbe es andere Möglichkeiten? z.B. alle Dateien irgendwo zentral includieren?

    dankschön für die Antworten
    gruss nate



  • Jester schrieb:

    interpreter schrieb:

    StdAfx.h ... ist bloß ein MFC-Header.

    Nö. StdAfx.h wird beim VC für die vorkompilierten Header benötigt und hat mit MFC nichts zu tun. Wenn man ein Konsolenprojekt anlegt ist der Header per default auch mit dabei.

    MfG Jester

    Ok. Ich habs bis jetzt nur einmal in nem MFC-Projekt gesehen. Ändert aber nichts dran, dass es nichts mit dem Problem zu tun hat. 😉



  • nate7 schrieb:

    wenn da noch mehr Klassen dazukommen, gibt das einen rechten include-Salat..

    nein, eigentlich garnicht. Jeder Header bringt das mit, was benötigt wird, damit man ihne ohne weiteres einbinden kann. Für jeden Header sollte folgendes Programm lauffähig sein:

    #include "DeinHeader.h"
    
    int main()
    {
    }
    

    Damit stellst Du sicher, daß jeder Header das mitbringt, was er braucht. Gegen versehentliches mehrfaches einbinden kannst Du Dich mit include-guards schützen (such einfach mal danach im Forum oder bei google).

    Alles zentral irgendwo einzubinden dürfte Dich nicht glücklich machen. Insbesondere kann es passieren, daß die Zeit, die für das übersetzen benötigt wird sich drastisch erhöht. Außerdem muß dann bei jeder Änderung eines Headers das komplette Programm neu kompiliert und gelinkt werden.

    MfG Jester



  • - stimmt, jester, das leuchtet ein.

    - aber das hier versteh ich nicht ganz:

    //Fehlermeldung im Dev-C++ mit Standardeinstellungen
    
    vertex.o(.text+0x0):vertex.cpp: multiple definition of `CEdge::CEdge(int, int, double)'
    main.o(.text+0x0):main.cpp: first defined here
    vertex.o(.text+0x3e):vertex.cpp: multiple definition of `CEdge::CEdge(int, int, double)'
    main.o(.text+0x3e):main.cpp: first defined here
    vertex.o(.text+0x7c):vertex.cpp: multiple definition of `CVertex::CVertex()'
    main.o(.text+0x7c):main.cpp: first defined here
    vertex.o(.text+0xfc):vertex.cpp: multiple definition of `CVertex::CVertex()'
    main.o(.text+0xfc):main.cpp: first defined here
    vertex.o(.text+0x17c):vertex.cpp: multiple definition of `CVertex::ResetVertex()'
    main.o(.text+0x17c):main.cpp: first defined here
    vertex.o(.text+0x182):vertex.cpp: multiple definition of `CVertex::Copy()'
    main.o(.text+0x182):main.cpp: first defined here
    
    // Edge.h, wird von Edge.cpp includiert
    
    #ifndef EDGE_DEFINITION
    #define EDGE_DEFINITION
    
    class CEdge
    {
    private:
         //...
    public:
         //...
    };
    #endif
    

    Ich habe jede Datei genau 1x includiert, nämlich schön hierarchisch:
    CEdge->CVertex->CGraph->CDijkstra->ReadFromTxt->Main.
    Wieso dann die Fehlermeldung?



  • Die Fehlermeldung kommt von deinem Linker, du hast die Methoden doppelt definiert oder vielleicht ausversehen 2x die Sourcedatei eingebunden, so dass sie doppelt übersetzt wird?



  • Dieses Phänomen tritt auch auf wenn man Inline Funktionen/Methoden in den Header Dateien hat, die keine Templates sind.



  • Hmm.. also 2x includiert hab ich sicher nicht, doppelt definiert auch nicht.

    Das mit den nicht-templates trifft eher zu. muss aber sagen, dass ich von templates noch gar nichts weiss, d.h. froh wäre, wenn ich meine klassen auch ohne definieren könnte. das geht schon, oder?

    wie müsste ich die funktionen denn anordnen, damit es läuft?
    int ReadFromTxt() {... } ist in ReadFromTxt.cpp, d.h. keine Header-Datei..

    @eViLiSSiMo: könntest du dein posting noch etwas ausführlicher schreiben? wär dir dankbar.

    gruss nate


Anmelden zum Antworten