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 zeileninhaltwas 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.