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

16.10.2012, 22:48

Klasse mittels einem Zeiger einer Funktion übergeben

Guten Abend

Ich habe erst vor kurzem angefangen zu programmieren und arbeite im Moment das Buch durch. Nach dem Kapitel mit den Klassen dachte ich, ich schreibe mal ein eigenes kleines Programm um alles zu festen, was ich bis jetzt gelernt habe. Und eigentlich läuft auch alles bestens, bis ich an dem Punkt ankam, wo ich eine Klasse einer Funktion übergeben sollte. Und eigentlich dachte ich, dass dies am besten mit einem Zeiger zu lösen sei, aber irgendwo habe ich einen Fehler, denn ich einfach nicht sehe.
Und zwar besteht mein Programm aus mehreren Quelltexten und Headerdateien, aber ich poste hier nur mal die Teile, die Probleme bereiten, falls es noch mehr braucht, so lasst es mich bitte wissen.

Klassendef.hpp

C-/C++-Quelltext

1
2
3
4
5
6
class CSpieler{ 
// Membervariablenprivate: 
int m_Lebenspunkte; int m_Verteidigung; int m_Angriffsstaerke;  char m_Name [25];
    // Memberfunktionenpublic:
    CSpieler ();    void Spielerdaten ();   void Levelup ();    void Spielerdmgermitteln (int *pSchaden);
};


Funktionendef.hpp

C-/C++-Quelltext

1
void Spielen ( CSpieler *pSpieler);



main.cpp

C-/C++-Quelltext

1
2
3
4
CSpieler *Spieler1;
int main () {
Spielen (&Spieler1);
return 0 }


Das sind die Zeilen, die mir Kopfschmerzen bereiten. Habe hier nur das wichtigste gepostet.
Kann man eine Klasse überhaupt mit dieser Methode an eine Funktion übergeben oder bin ich da total auf dem Holzweg?
Und falls ja, wieso kommt dann bei meinem Programm die Fehlermeldung:

Zitat

1>-\eigenesprojekt\funktionsdefinition.hpp(6): error C2065: 'CSpieler': nichtdeklarierter Bezeichner
1>-\eigenesprojekt\funktionsdefinition.hpp(6): error C2065: 'pSpieler': nichtdeklarierter Bezeichner
1>-\eigenesprojekt\funktionsdefinition.hpp(6): error C2182: 'Spielen': Unzulässige Verwendung des Typs 'void'


Falls jemand eine Antwort darauf wüsste, wäre ich wirklich extrem dankbar.
Einen schönen Abend

2

16.10.2012, 23:05

Guten Abend und willkommen im Forum!

Mir fallen an Code und Fehlermeldungen zwei Dinge auf:
1. Der Compiler verrät dir bereits, wieso er den Code so nicht durchgehen lässt: In der Datei funktionendef.hpp ist CSpieler nicht deklariert, d.h. dieser Beichner ist "nicht bekannt". Das lässt sich lösen, indem du die Klasse vorher deklarierst, also indem du vor die Funktionsdeklaration

C-/C++-Quelltext

1
class CSpieler;

schreibst, oder indem du die gesamte Klassendef.hpp per #include einbindest.
2. Du hast in der main()-Funktion

C-/C++-Quelltext

1
Spielen(&Spieler1);

stehen. Das ist gleich doppelt problematisch, denn zum einen erwartet die Funktion Spielen() einen Zeiger auf einen CSpieler, was Spieler1 bereits ist. Somit ist dein übergebener Parameter vom falschen Typ, denn &Spieler ist ein CSpieler**. Zum anderen ist Spieler1 nicht initialisiert - du weißt nicht, wohin der Zeiger zeigt. Am einfachsten ist das Problem zu lösen, in dem du eine einfache Instanz erstellst und dann aber tatsächlich den Adress-Operator anwendest. Falls du unbedingt einen Zeiger verwenden (CSpieler als Zeiger definieren) willst, dann ist wohl new/delete für dich interessant.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

16.10.2012, 23:05

Das Problem ist, dass die Klasse an den Stellen, wo du CSpieler verwenden willst, nicht bekannt ist. Du musst dort deinen Header inkludieren, bzw. wenn du nur einen Zeiger deklarieren willst, reicht eine Forward Declaration. Dein Objekt Spieler1 sollte außerdem wohl ein CSpieler und kein CSpieler* sein. Und eigentlich müsste das Ding keine globale Variable sein, einfach lokal in main() würde wohl auch reichen... ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

17.10.2012, 07:12

Übrigens übergibt man keine Klassen, sondern Instanzen von Klassen. Eine Instanz ist eben ein echtes Objekt mit Daten drin, eine Klasse ist nur ein Datentyp, ein abstraktes Konstrukt, ein Bauplan, wenn Du so willst. :)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

17.10.2012, 14:26

herzlichen dank euch allen, es hat nun geklappt :)
und @dot, die Klasse wird eigentlich auch in der main Funktion instanziert, habe mich oben nur verschieben.
Danke !!

Werbeanzeige