Klassen
-
Ich komm einfach nicht drauf was ich falsch mache.
Ich hab 3 Klassen, Person, Spieler/Player die von Person erbt und Spiel/Game die eine Instanz von Player enthält. Mal ein bischen Code um es zu veranschaulichen.
Person.h:
#pragma once //[...] class Person { protected: ENTITY *Ent; int healthy; char *Name; public: Person(char *Name, char *FileName, VECTOR *position); Person(char *Name, char *FileName, VECTOR *position, EVENT event); ~Person(void); //[...] };Player.h:
#pragma once #include "Person.h" #include "Game.h" //[...] class Player : public Person { public: Player(char *Name, char *FileName, VECTOR *position); ~Player(void); protected: void setEvent(); static void Event() { //Event Hit if([...]) { //C2039: 'Schueler' kein Element von 'Game' Game::Schueler->Hit(5); } } };Game.h
#pragma once #include "Player.h" //[...] class Game { protected: static bool Running; public: //C2143: Synatax Fehler es fehlt ';' vor '*' //->'default-int' Fehler static Player *Schueler; //[...] };Irgendjemand ne Idee woher die Fehler kommen?
Danke im Voraus SWW13.
-
naja - du hast ne kreisabhängigkeit drin...
versuch ma ds in der game.h zu schreiben:#pragma once //#include "Player.h" brauchst du nicht mehr, wir nehmen ne forward deklaration class Game { protected: static bool Running; public: static class Player *Schueler; //die forward-deklaration kann man auch einzeln machen, aber ich finds so schöner ^^ };noch mal zur erklärung, warum deins net ging:
player.h included game.h, die will wiederrum wieder die player.h includen - der compiler bricht den ring auf und schon compiliert er eins von beiden, ohne das andere zu kennen... so was sollte man vermeiden - udn wenn mans net vermeiden kann, muss man eben gucken, dass ne forward-deklaration reicht...
wobei es hier au scho reichen würde, die implementationen in die *.cpp zu verschieben und demzufolge dort auch erst game.h zu includen...bb
-
Danke für die schnelle Antwort das ganze tut soweit, bloß mekert er jetzt an einer Methode von Game rum, die den Konstruktor von Player aufruft:
void Game::createPlayer() { //C2514: 'Player': Klasse besitzt keine Konstruktoren Schueler = new Player([...]); }Das selbe beim Aufruf einer anderen Methode von Player, ich hab schon versucht ein 'class' anzufügen, ohne Erfolg. Gibt es beim Methoden/Konstruktor Aufruf nen extra Schlüßelwort für forward-deklaration?
-
In der
Game.cppmusst du natürlichPlayer.hinkludieren. Such mal nach "Forward Declaration", damit duch auch verstehst, was hier gemacht wird. Bin grad zu faul, dazu eine Erklärung abzugeben
Grüssli
-
Danke an euch, das inkludieren der "Player.h" wirkt Wunder. Forward Declaration war genau was ich gebraucht hab.
-
SWW13 schrieb:
Danke an euch, das inkludieren der "Player.h" wirkt Wunder. Forward Declaration war genau was ich gebraucht hab.
genau deshalb hab ichs ja geschrieben : >