include funktioniert nicht?
-
hi,
ich bin gard langsam am verzweifeln, ich weiß das es bestimmt wieder nur ein ganz kleiner fehler ist, aber ich finde ihn einfach nicht.
ich hab in meinem projekt unter anderem die dateien
tDirEntry.h:#ifndef TDIR_H #define TDIR_H class tDirEntry { public: char *GetName(); char *GetPath(); int GetSize(); int GetDate(); void SetName(char *NameToSet); void SetPath(char *PathToSet); void SetSize(int SizeToSet); void SetDate(int DateToSet); private: char *Name, *Path; int Size, Date; }; #endifund tDir.h:
#ifndef TDIR_H #define TDIR_H #include <tDirEntry.h> class tDir { public: tDir(); ~tDir(); void ChangeDir(char *Path); void Scroll(bool Up); private: tDirEntry *Entries[4096]; char *CurrentPath; }; #endifbeim compilieren bekomm ich dann aber immer den fehler:
tDir.h:35: error: ISO C++ forbids declaration of ‘tDirEntry’ with no type tDir.h:35: error: expected ‘;’ before ‘*’ token tDir.h:35: error: ISO C++ forbids declaration of ‘tDirEntry’ with no type tDir.h:35: error: expected ‘;’ before ‘*’ token(plus natürlich die meldungen das "Entries" fehlt, was hierfür aber irrelevant sein dürfte)
das problem das der compiler hierbei hat ist ja das ihm die klasse "tDirEntry" fehlt. diese ist doch aber eindeutig in "tDirEntry.h" definiert, und der header ist doch auch eingebunden?
wieso erkennt er die klasse nicht?
und das beste: wenn ich einfach statt dem #include... einfach die definition der klasse reinkopiere funktioniert alles wunderbar.
für mich heißt das dann das er aus irgeneinem grund den header nicht einbindet, bloß warum versteh ich nicht.
-
verzweifelter schrieb:
hi,
ich bin gard langsam am verzweifeln, ich weiß das es bestimmt wieder nur ein ganz kleiner fehler ist, aber ich finde ihn einfach nicht...3 Dinge fallen mir hier auf:
a) Includeguards müssen eindeutig benannt sein.
verzweifelter schrieb:
hi,
tDirEntry.h:#ifndef TDIR_H #define TDIR_H ...und tDir.h:
#ifndef TDIR_H #define TDIR_H ...Das kann garnicht funktionieren, da der Compiler hier nur (je nach dem mit welcher Datei er beginnt) eine der beiden Klassen finden kann. Ein gerne gemachter Copy/Paste-Fehler...
b) Die eckigen Klammern beim Include sollten in der Regel den Bibliotheksheadern überlassen sein... (#include <tDirEntry.h> => #include "tDirEntry.h"), der Unterschied ist, wo die Dateien überall gesucht werden.
c) Sofern man es vermeiden kann würde ich ein Include so weit wie möglich herauszögern (Wenn du die Gründe wissen willst kannst du ja man nach pImpl- oder Handle-Body Idiom googeln, dabei wird es gerne auch erwähnt).
... class tDirEntry; class tDir { ... tDirEntry *Entries[4096]; }; ...Eine Vorwärtsdeklaration reicht in diesem Fall da bei der Deklaration eines Zeigers oder einer Referenz der konkrete Typ noch nicht bekannt sein muß. Das Include müsstest du in dem Fall in der cpp machen.
cu André
-
ok, vielen dank, ich wusste doch das es wieder nur so eine dumme sache ist. includeguards geändert und alles funktioniert!
und danke auch für die tipps, da werd ich mich nochmal schlau machen.nochmal vielen dank