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

07.08.2011, 17:22

Abstrakte Spielklassen

Hallo zusammen,
ich hab über das Wochenende versucht mein Spiel von der bisherigen Weise wie die Spielzustandsfunktionen aufgerufen werden (also über zwei switch Anweisungen und dann sowas wie m_pMainMenu->Move(fTime); ) umzustellen auf die Weise wie sie in Kapitel 9 beschrieben (ich hoffe das ihr wisst wovon ich rede; also eine Abstrakte Spielzustandsklasse und die anderen Spielzustände leiten sich davon ab; ein einfaches m_pGameState->Move(fTime) übernimmt dann alles).
Mir ist bewusst, dass wenn man bei einem fortgeschrittenen Entwicklungsstadium etwas so grundlegendes ändert, dass man dann mit Problem rechnen muss, aber ich krieg einen Error, denn ich nicht lösen kann.
Das Problem ist wie folgt: Meine Klasse die die Spielzustände verwaltet (im Buch CMyGame genannt) leitet sich ja von der abstrakten Spielklasse CGame ab. Ich bekomme immer die folgenden Error:
Include\MyGame.h|63|error: invalid use of incomplete type 'struct CGame'|
Include\GameState.h|4|error: forward declaration of 'struct CGame'|
Die entsprechenden Zeilen sehen so aus:

C-/C++-Quelltext

1
2
3
4
5
//MyGame.h Zeile 63:
class CMyGame : public CGame { ....

//GameState.h Zeile 4
class CGame;

Für mich sehen die errormedungen danach aus als ob der Compiler die Datei Game.h nicht findet (in der CGame deklariert ist). Ich hab diese aber in MyGame.h includiert. Deshalb bin ich etwas ratlos. Hat jemand mal ähnliche Problem gehabt oder kann mir erklären, was ich falsch mache?
Vielen Dank schonmal,
Foaly

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

07.08.2011, 17:56

Die Klassendefinition muss bekannt sein bevor du davon erbst. Eine Vorwärtsdeklaration reicht da nicht aus.

3

07.08.2011, 18:01

Danke für die schnelle Antwort.
Ja aber ich definiere die Klasse CGame ja in Game.h und dass inkludiere ich vor Zeile 63 also ist es doch nicht nur eine Vorwärtsdeklaration oder versteh da was falsch?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

07.08.2011, 18:08

Lies am besten mal das hier durch. Ich bin mir ziemlich sicher, dass du ein zyklischen include hast.

5

07.08.2011, 18:33

Oh nochmal danke. Der Artikel war sehr interessant. Allerdings hab ich kein zyklisches include. Meine Dateistruktur sieht so ähnlich aus wie die im Artikel beschriebene. In der Datei GameState.h hab ich class CGame; stehen und dann folgt die Deklaration der Klasse CGamestate (die auch einen member pointer auf CGame hat). Dann hab ich noch die Datei Game.h in der CGame dann vollständig deklariert ist. Diese beiden Dateien werden in MyGame includiert (dort steht ja dann auch class CMyGame : public CGame {...) Die .cpp Dateien mit den Definitionen inkludieren dann MyGame.h
Hab ich was falsch verstanden? Eigentlich müsste doch alles so richtig sein oder?

6

07.08.2011, 18:36

Zeig uns doch den include aller Dateien von dennen du redest.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

07.08.2011, 18:40

Oder probier deinen Code soweit zu reduzieren, dass du ein (für uns) kompilierbares Beispiel hast. Da wirst du dann den Fehler wahrscheinlich sowieso selbst finden. ;)

8

07.08.2011, 18:50

OK ich werde mal versuchen einen Minimal Code zu erstellen.

9

07.08.2011, 20:27

Ok ich hab soweit alles raus genommen was irgendwie ging. Es ist nur noch der Intro Gamestate übrig, weil der am simpelsten gestrickt ist und praktisch nur ein Bild lädt.
Hier gibts das ganze herunterzuladen: http://max.jewieft.de/games/Minimal Code…ate Problem.zip
Noch ein paar Infos die eventuell hilfreich seinen könnten:
IDE: Code::Blocks Release 10.05 rev 6283
Compiler: MinGW, gcc version 4.5.2
Vielen Dank schon mal im voraus!!! :)

edit: warum ist den das wort "vor raus" (zusammen geschrieben) zensiert?

Edit 2: ich hab noch was vergessen… meine Klassen heißen ein bisschen anders. Die CGame Klasse heißt CStateMachine und die Klasse CMyGame heißt CPotionMaster. Aber sonst ist alles gleich. Sorry…

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Foaly« (07.08.2011, 20:39)


10

07.08.2011, 23:45

Weil es "voraus" heißt ;) .

Werbeanzeige