Beginner - verständnissfrage zu klassen



  • hallo zusammen,

    ich habe eine kleine anwendung gebastelt ( einen pathfinder mit dem A* ).
    nun wollte ich den code einfach mal ein bissen aufräumen so wie sich das gehört
    und die klasen definition und deklaration trennen.

    also hab ich eine pathfinder_class.h datei gemacht und diese in mein
    main.cpp script eingebunden ' #include "pathfinder_class.h" '.
    so das geht auch soweit, keine fehler ...
    aber wenn der compiler nun die dazugehörige pathfinder_class.cpp datei abarbeitet
    dann meckert er das er datentypen nicht kennt die aus den includs der main.cpp
    kommen. in der pathfinder_class.cpp sind z.b. members:

    ifstream f;  // Datei-Handle
        string s;   // string mit zeileninhalt
    

    was ist falsch ...
    muss ich '#include <string>' auch in jede classen *.cpp datei schreiben ?

    vielen dank schonmal
    cu
    uwi2k2



  • wenn eine klasse strings benutzt, dann sollte das #include <string> in den header der klasse.



  • Du musst den Header auch in die cpp Datei einbinden, falls du das nicht gemacht haben solltest.

    string u.ä. Header kannst du ruhig auch nochmal in der cpp inkludieren, notwendig ist es aber nicht, wenn du sie schon in der .h hast. Ich inkludier sie allerdings trotzdem, einfach weil ich es logischer finde immer das, was ich in der entsprechenden Datei benutze, auch zu inkludieren.

    Vergiss die Includeguardes im Header nicht!

    #ifndef PATHFINDER_CLASS_H
    #define PATHFINDER_CLASS_H
    
    //dein Code
    
    #endif  //PATHFINDER_CLASS_H
    


  • hallo und danke erstmal,

    es stimmt halt doch .. jemanden fragen der ahnung hat ist besser als 1000 bücher lesen 🙂

    aber was sind/bedeuten diese 'Includeguardes' und in welcher datei setze ich sie
    wie ein ?

    danke
    kai



  • Die include Guards schuetzen vor Verletzungen der ODR.

    In jeder Uebersetzungseinheit darf immer nur eine Definition von etwas stehen. Also nur einmal da definiert werden wie std::string aussieht. Die include guards stehen in den Header Dateien und schuetzen vor mehrmaligen inkludieren dieser datei in dieser uebersetzungseinheit.



  • Und noch kurz an einem einfachen Beispiel:

    //A.h
    class A{};
    
    //B.h, die Klasse B soll ein Objekt der Klasse A bekommen (z.B)
    #include "A.h"
    class B{
        A einAttribut;
    };
    
    //main.cpp, hier wollen wir nun Klasse A und Klasse B verwenden
    #include "A.h"
    #include "B.h" //BUMM
    
    int main(){
        A a;
        B b;
    }
    

    Der Compiler ersetzt bei Include nämlich einfach den include durch den entsprechenden Code, mit andern Worten hier sieht die main.cpp am Ende so aus:

    class A{};  //durch inkludieren von A.h
    class A{};  //inkludieren von B.h
    class B{
        A einAttribut;
    };
    
    int main(){
        A a;
        B b;
    }
    

    Und schon haben wir Klasse A 2x definiert was natürlich nicht geht.


Anmelden zum Antworten