Bedingtes includieren von Header-Dateien
-
mich interessiert wir ihr eure klassen in cpp/h-dateien strukturell darstellt, und wir ihr beidseitige abhängigkeiten von klassen vollkommen automatisch und mit minimalem neuerstellungs-includieraufwand beim compilieren realisiert.
also:
normalerweise geht man hin und benutzt für jede klasse eine eigene cpp und headerdatei. in der headerdatei steht die klassen-definition und in der cpp-datei die methodendefinitionen. wenn man in einer klasse andere klassen braucht, dann includiert man diese in der headerdatei und/oder auch in der cpp datei, je nachdem wo sie gebraucht werden. um eine mehrfachincludierung der klassendfinitionen zu vermeiden, muss man das includieren der klassendefinitionen mit einer präprozessoranweisung der art "#ifndef XYZ #define XYZ ... #endif" beschränken.
normalerweise sieht das dann wie folgt aus:
Headerdatei: class CMyClass; #ifndef CMYCLASS #define CMYCLASS #include "NeededClass.h" class CMyClass { public: CMyClass(void); ~CMyClass(void); public: void MyFunction(void); private: unsigned char m_MyCharcter; }; #endif
wenn man nun gegenseitige abhängigkeiten hat, also kalsse a braucht klasse b und klasse b braucht klasse a (in irgendeiner form), dann stellt sich die frage wie man das am besten mit einem includiersystem realisiert, das für alle abhängigkeitstypen funktioniert, und zwar vollautomatisch und mit minimalem neuerstellungs-includieraufwand.
hat der jemand eine idee?
ich habe einen ansatz, würde aber gene erst mal sehen wie ihr das macht (besonders "!", der ja der meinung ist das das kein problem sei... )
-
jede Datei einen header
der Header der Main datei includiert alle Header
alle Dateien includieren main headerganz schlecht und dreckig, aber geht meistens
außerdem hat bis jetzt noch niemand was besseres vorgeschlagen
-
und was hat das mit dem spiele-forum zu tun ?
-
stimmt, nicht so viel, solls ein admin verschieben. dieses thema ergab sich aus einem anderen thema, das ein spielprogrammierungs-thema war...
@der tolle
deine methode ist die einfachste, aber auch die langsamste. wenn man in einer datei was ändert müessen ALLE neukompiliert werden.
-
Naja, jede Datei #includet alles wovon die gesamte Definition gebraucht wird, wenn nur der Name gebraucht wird (Bsp: class foo enthält ein bar*) reicht eine Forwarddeklaration, wie sollte man das denn sonst machen?
-
du hast soweit recht. nur wie realisiertst du das?
schreibst du bei einer definiton-abhängigkeit '#include "CXYZ.h"' und einer reinen namens-abhöngigkeit 'class CXYZ;'? dann hast du das problem, das diese art nur in speziellen fällen funktioniert, und zwar in all den fällen, wo du die klasse "CBLABLA", die die klasse CXYZ nur als namens-abhöngigkeit braucht, nicht alleine irgendwo includuert wird, sondern noch mindestens eine andere klasse exisitiert, die die klasse CXYZ als definitions-abhäängigkeit braucht.
sonst ensteht folgendes:
main.cpp:
#include "CBLABLA.h"
void main(void)
{
CBLABLA MyClass; //hier kennt er kann nicht die klasse CXYZ innerhalb von CBLABLA, weil sie nur als vorwärtsdeklaration angegeben wurde.
}was ich suche ist ein system, das immer auf die gleiche weise (also ohne irgendwo von hand in speziellen fällen noch was einzutragen) alle möglichkeiten der includuierung ermöglicht.
im bestenfall definiert man NUR in der cpp und h datei einer klasse alle abhängigkeiten und nirgendswo ausserhalb.
-
Wenn ich CBLABLA inkludiere dann verwende ich auch nur CBLABLA und CBLABLA kann dann intern CXYZ verwenden, wenn ich ein CXYZ brauche dann inkludiere ich eben auch den CXYZ-Header.
im bestenfall definiert man NUR in der cpp und h datei einer klasse alle abhängigkeiten und nirgendswo ausserhalb.
Den Satz verstehe ich ehrlich gesagt nicht, erläuter das mal näher!
-
ich denke, dass das hier in "rund um..." besser aufgehoben ist
-
der Ansatz möglichst viel zu includieren ist eh falsch. Du solltest möglichst die Abhängigkeiten innerhalb der Header Dateien so gering wie möglichst halten. Zur Not eben mit dem Impl-Idiom. Manchmal glaubt man gar nicht, wie schnell der Compiler abgeht, wenn man <iosfwd> anstelle von <iostream> und <fstream> nimmt.
http://www.gotw.ca/gotw/007.htm
http://www.gotw.ca/gotw/024.htm