Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

killmichnich

unregistriert

1

16.05.2009, 11:11

probleme mit includes

Hi,
ich arbeite zur Zeit an einem kleinen neuen Spiel. Ich schreib mir für jede Klasse die ich hab eine .h und eine dazugehörige .cpp datei und includiere die dann in meinem main Programm. Mein Problem ist es jetzt, dass ich in manchen Klassen Zugriff auf andere Klassen brauche, und die auch dementsprechend per #include einfügen muss. Das ganze is mittlerweile schon recht kompliziert und oft funktioniert es auch nicht, da krieg ich dann nen error, dass ne klasse nich gefunden wurde obwohl ich sie includiert hab.
Meine Frage ist jetzt, wie ich das etwas einfacher gestalten kann, sodass ich von jeder Klasse Zugriff auf alle anderen habe. Ich hab mir schon überlegt einfach eine datei zu machen in der ich alles includier und die dementsprechend von allen klassen includiert wird, das funzt nur leider nicht.
Würde mich über Hilfe sehr freuen!! :D

MfG Killmichnich

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

2

16.05.2009, 11:22

Du kannst eine globale Header-datei für all deine Libs und Header anlegen.

Dort includest du alles was du brauchst, wie z.b Engine Header what ever.
Anschließend musst du nur noch diese globale Header einbinden und hast alles was du brauchst...

3

16.05.2009, 11:29

Du bruachst wahrscheinlich forwarddeclarations.
Wenn Klasse A auf B zugreifen muss und umgekehrt geht das normalerweise nicht, da sich die Header gegenseitig einbinden würden, wodurch er unendlich inkludieren würde.
Wenn du aber nur Zeiger und Referenzen im Header benötigst, reicht es, in der .h ein class A; zu schreiben. In der .cpp musst die dann allerdings die Datei includieren also #include "A.h".
Mehr findest du im inet unter forward declaration.
Lieber dumm fragen, als dumm bleiben!

killmichnich

unregistriert

4

16.05.2009, 11:31

aber funzt das denn so mit diesem gegenseitigen includieren?
das sähe ja dann in etwa so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
globalheader.h:

#include "class1.h"
#include "class2.h"
....

und in class1.h und class2.h ja dann:

#include "globalheader.h"

oder?
funktioniert das mit diesem gegenseitigen includieren?

5

16.05.2009, 11:37

so bekomsmt du erstmal ne endlos-include-schleife.
Damit sowas überhaupt funktionieren KANN (aber selbst dann kanns probleme geben) musst du in die header (ausgenommen der hauptheader) include guards machen (dazu soltle die SuFu was liefern) und vor dem include des hauptheaders forward declarations platzieren.
Frage: hast du nur fälle, in denen Klasse A von B abhängig ist, aber B nciht von A, oder auch welche, in denen beide voneinander abhängig sind?

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

6

16.05.2009, 11:38

Nein, so hast du das Problem nur wo anders hin verlegt. jetzt würden sich globalheader.h und die classX.h immer gegenseitig inkludieren. Ich denke das hat aber nix mit forward deklarations zu tun, das Problem lösen includeguards. Nur wenn die Klassen sich gegenseitig brauchen, weil sie z.B. membervariablen des jeweils anderen haben, dann musst du die jeweils erstmal mit class Class1; bekannt machen.

killmichnich

unregistriert

7

16.05.2009, 11:44

also bei mir im projekt siehts derzeit ca. so aus:
ich hab ne header datei global.h in der bestimmte structs, defines, enums o.ä. deklariert sind, die ich öfter im projekt brauch
dann hab ich ne klasse ResManager, wo alle wichtigen sachen wie z.B. Texturen und so verwaltet werden, und unter anderem eben auch klassen.
Ich hab mir ne Klasse für Hindernisse geschrieben, die direkt von der klasse Sprite verarbeitet werden, sodass mein spieler nich drüber rennen kann. Diese ganzen hindernisse speicher ich in ner liste in meinem ResManager und frag die anschließend mit dem Sprite ab.

und da war jetzt das Problem, dass sich die Klasse Hindernis und die Klasse ResManager gegenseitig includieren, da der resmanager die texturen von dem hindernis hat und der resmanager gleichzeitig die position das hindernis speichert.

8

16.05.2009, 11:53

Zitat von »"n0_0ne"«

Nur wenn die Klassen sich gegenseitig brauchen, weil sie z.B. membervariablen des jeweils anderen haben, dann musst du die jeweils erstmal mit class Class1; bekannt machen.

das hilft dir bei Klassenobjekten als member oder funktionsparameter etc. auh nciht, für die muss die klassendefinition bekannt sein, nur wenn du zeiger verwendest und nicht auf member zugreifst, reicht die deklaration.

@killmichnich: der ResManager verwendet aber auschließlich zeiger, und greift im header auch nciht auf member der beiden klassen zu, oder? weil dann würd e eine deklaration á là class Hindernis; im header des ResManagers und das rausnehmen der dort efindlichen includes reichen. Die includes müssten dann natürlich in die cpp, aber die wird ja ncirgendwo inkludiert.

killmichnich

unregistriert

9

16.05.2009, 12:00

also müsste ichs so machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
ResManager:

statt #include "Hindernis.h"  
einfach class Hindernis;

und dann einfach in den Funktionen:
void AddHindernis(Hindernis* hindernis);

oder?

10

16.05.2009, 12:01

genau

Werbeanzeige