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

1

21.06.2006, 08:02

frage zu dateienaufspaltung

hallo mal wieder :)

also ne kleine frage hätt ich dann noch zum abschluss.

also normalerweise spaltet man den code ja in mehrere dateien sozusagen auf.

z.b. bei nem rollenspiel wird das wohl ca so aussehen
EnemyNormal.cpp
EnemyNormal.h
Hero.cpp
Hero.h
EnemyBoss.cpp
EnemyBoss.h

etc...

jetzthab ich da aber ne frage nämlich:
die enemy funktionen brauchen ja logischerweise die "kenntnis" über die hero class --> include "Hero.h" damit man dann berechnungen anstellen kann wie:
leben abziehen, mana absaugen, schaden vom hero über eine gewisse zeit reduzieren etc.

so und die hero funktionen brauchen demnach dann die kenntnis über die gegnerklassen --> include "EnemyNormal.h", include "EnemyBoss.h".

jetzt hat man da natürlich ne tolle endlosschleife beim kompilieren.

hero.cpp wird kompiliert --> include enemy --> include hero --> include enemy --> include hero

solange bis irgendwann ne fehlermeldung kommt.

jetzt wäre mir die idee mit den include guards gekommen

#ifndef BLABLA_H_INCLUDED
#define BLABLA_H_INCLUDED
...
#endif

nur bringt das anscheinend auch nichts, oder ich mach damit was falsch^^

so also zu meiner frage:

wie schaut das bei euch z.b. auf mit der dateienaufspaltung, oder könnt ihr mir da so ein grundbeispiel liefern, weil die im buch angeführten beispiele, sind ja nicht besonders kompliziert imo ...

naja hoffe wie immer auf hilfe :)

dangöö ;)

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

21.06.2006, 10:47

Also... Ganz oben schreibst du bei jeder .h-Datei #pragma once hinein... Damit wird sie nur EINMAL durchgegangen...
Für das Problem, dass jede Klasse auch die anderen kennen muss, gibt es die s.g. Vorwärtsdeklarationen...:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//Header.h <-- Wird von jeder cpp-Datei eingebunden!

#include "CEnemy.h"
#include "CHero.h"
#include "CEnemyBoss.h"

//-------------------------//

//CEnemy.h


#pragma once

//Vorwärtsdeklarationen

class CHero;
class CEnemyBoss;

//Die Klasse selbst!

class CEnemy
{
    //...

};

//-------------------------//

//CHero.h


#pragma once

//Vorwärtsdeklaration

class CEnemyBoss;

//Die Klasse selbst!

class CHero
{
    //...

};

//-------------------------//

//CEnemyBoss.h


#pragma once

//Die Klasse selbst!

class CEnemyBoss
{
    //...

};

//-------------------------//
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

3

21.06.2006, 11:11

super danke

d.h. also ich mach eine "unversalheader" datei , die die wichtigsten header includiert.

und statt den include guards einfach das pragma once. oder soll ich die include guards auch noch reinmachen?

mfg
Drac

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

21.06.2006, 11:45

Die Include-Guards kannst Du ruhig reinmachen. Nicht jeder Compiler kennt #pragma once.
Das mit der "Super-Header" muss nicht sein. Ansonsten mach es aber so, wie Panther vorgeschlagen hat.

Die Header-Dateien sehen ca. so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// ******* Hero.h *******


// ...


// Vorwärtsdeklaration

class Enemy;
class ...

// Klasse Hero

class Hero
{
    // ...

};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// ******* Enemy.h *******


// ...


// Vorwärtsdeklaration

class Hero;
class ...

// Klasse Enemy

class Enemy
{
    // ...

};


Die Code-Dateien binden dann die benötigten Header-Dateien ein:

C-/C++-Quelltext

1
2
3
4
5
6
// ******* Hero.cpp *******


#include "Enemy.h"
#include ...

// ...


C-/C++-Quelltext

1
2
3
4
5
6
// ******* Enemy.cpp *******


#include "Hero.h"
#include ...

// ...


In den Header-Dateien gibst Du durch die Vorwärtsdeklarationen einfach nur kurz bekannt, dass es entsprechende Klassen gibt, damit Du sie in Methodendeklarationen benutzen kannst. Die Header-Dateien werden dann erst in den cpp-Dateien eingebunden, damit dort die Funktionalität der Klassen bekannt ist.
Ich hoffe, die o.g. Code-Schnipsel sind nicht zu knapp gehalten und es ist verständlich genug gewesen? Panther hatte es ja auch schon ganz gut erklärt...

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

5

21.06.2006, 12:31

#pragma once ist nichts anderes als ein Include Guard, der aber nicht für alle Compiler funktioniert.

Die #ifndef / #define Variante ist da etwas portabler, auch wenn man etwas mehr zu tippen hat. Wenn man sich erstmal dran gewöhnt hat, passiert das beim Schreiben von neuen Headern automatisch, :)

MfG
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

6

21.06.2006, 14:13

Hmm... ne schöne Erklärung dazu hat mal Jochen Kalmbach gegeben: http://www.c-plusplus.de/forum/viewtopic-var-t-is-149942-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

Wobei man auch bei MSC Versionen unter 1000 nicht mit pragma once arbeiten kann, da es nicht unterstütz wird!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige