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

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

1

09.09.2007, 14:45

Bekanntmachungsproblem

Hallo, ich hab mir den Code von Galactica mal hergenommen und umprogrammiert, dass es zu meinem Spiel passt. Jetzt habe ich aber folgendes Problem:
In der ManagerKlasse, ich glaube Ursprünglich war das CGalactica wurden die include-Dateien eingebunden:

C-/C++-Quelltext

1
2
3
4
5
6
#include <vector>
#include "Intro.h"
#include "MainMenu.h"
#include "ProduktionsGebeude.h"
#include "Game.h"
#include "Resource.h"


Jetzt habe ich das Problem, das der Klasse CGame, die Klasse CProduktionsGebeude bekannt sein muss, was ja auch kein Problem ist, da Produktionsgebeude.h eher eingebunden wird.
Allerdings wird in Game.h eine Struktur definiert, auf die CProduktionsgebeude zugreifen will.
Ich kann noch nicht so gut C++, wie muss ich das abändern, damit beide beides kennen?
-->Wenn die Struktur zuvor noch in class CGame definiert wurde, muss ich die da rausnehmen und vor die Klassendefinition setzen, damit sie überhaupt anderen bekannt sein kann, ist das dann eine globale Struktur?

Noch eine Frage: In Galactica war es so, dass die Cpp-Dateien alle die Headerdatei der Managerklasse included haben: #include Galactica.h
Wurde die dadurch nicht mehrfach eingebunden, was ja eigenltich nicht erlaubt ist?

Vielen Dank für eine Antwort, viele Grüße
Andreas

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

09.09.2007, 15:39

Probiers mal mit einer Vorwärtsdeklaration

C-/C++-Quelltext

1
2
class foo;
void IchBenutzeFoo(foo* foofoo);

Die Mehrfacheinbindung wird durch Includeguards verhindert ;) Ich glaube das war da auch irgendwo Thema.

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

3

09.09.2007, 17:33

sry, wie soll ich das anwenden:

Game.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include Galactica.h

struct Sdarta{
int irgendwas;
int irgendwasanderes;
};

class CGame
{
CProduktionsgebeude ProdGeb;
Sdarta Daten;
}

Produktionsgebeude.h:

C-/C++-Quelltext

1
2
3
4
5
6
#include Galactica.h

class CProduktionGebeude
{
Sdarta Daten2;
}


Könntest du das vielleicht an diesem konkreten Beispiel klar machen, sry kann noch nicht so gut programmieren

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

09.09.2007, 21:00

Zitat von »"Andreas"«

Produktionsgebeude.h:

C-/C++-Quelltext

1
2
3
4
5
6
#include "Galactica.h"

class CProduktionGebeude
{
Sdarta Daten2;
}



Wie wäre es mit:

Zitat von »"Andreas"«

Produktionsgebeude.h:

C-/C++-Quelltext

1
2
3
4
5
6
#include "Game.h"  //<-- ersetzen


class CProduktionGebeude
{
Sdarta Daten2;
}



Galactica.h wird ja in Game.h eingebunden, dass heisst, dass du auch in Produktionsgebeude.h darauf zugreifen kannst.

Edit:
Habe schon lange nichts mehr in C++ gemacht,dachte so sollte es gehen, aber mit den includes hatte ich auch immer Probleme. ;-)

Wie konnte ich die Anführungszeichen nur übersehen... :oops:

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

10.09.2007, 11:31

Da fehlen schonmal, ganz grundlegend, die Anführungszeichen bei deinem Headerbezeichner.
@D13_Dreinig

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

6

10.09.2007, 20:23

Vielen Dank für die Antworten,
tut mir leid, ich hatte leider in den Angaben einen kleinen fehler gemacht:
Die einbindung der Includedatei #include Galactica.h findet nicht direkt in den Headerdateien Game.h und Produktionsgebeude.h statt, sondern in den dazugehörigen cpp dateien.
Wenn ich trotdem #include Galactica.h durch Game.h ersetzte gibt es unzählige Compilerfehler, die Sachen in Game.h anmängeln, die eigentlich völlig inOrdnung sind.

Tut mir echt leid, dass ich mich zu Beginn vertan habe, gibt es denn trotzdem noch ne Möglichkeit wie man das Problem lösen kann, mit diesen ganzen Headerdateien Blick ich nicht mehr so richtig durch...

Vielen Dank nochmal, viele Grüße
Andreas

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

10.09.2007, 22:04

Also ich würde dir empfehlen alles mal nochmal gaaaaan gut durchzudenken.
#include macht ja eigentlich nichts anderes, als den Inhalt der Datei dort einzufügen. Durch die Headerguards wird verhindert, dass etwas 2 mal eingefügt wird, da das ja unnötig ist. (es steht ja schon irgendwo "oben").

Und jetzt ist ja eigentlich klar, was es zu tun gibt. Alles, was "unten" steht darf keine Klasse verwenden, die "unter" ihr steht. Jetzt musst du nur alles logisch einordnen und es sollte klappen. (so habe ich es bei mir hingekriegt).

Anderseits kannst du aber auch die Vorwärstdeklaration bentutzen, die Das Gurke schon erwähnt hat.

Andere Methoden kenne ich leider noch nicht, die das ganze vereinfachen. ;-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

11.09.2007, 09:43

Ja, so ähnlich ist das mit den Includeguards wirklich. Allerdings können Header trotzdem öfter inkludiert werden, nämlich in mehrere Module (sprich cpp Dateien). Das "nicht wieder" inkludieren bezieht sich auf ein Modul.

Und die gängige Methode für das gepostete Problem ist einfach Forwarddeclaration. Das hat dann noch den netten Nebeneffekt das so, bei geschicktem Inkludieren, die Compilierzeit vermindert werden kann.
@D13_Dreinig

Werbeanzeige