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

KeyC

Frischling

  • »KeyC« ist der Autor dieses Themas
  • Private Nachricht senden

1

17.11.2011, 19:58

Problem: Klasse "global" verwenden können ohne sie global zu deklarieren

Guten TagIch habe mich auch mal auf diesem Board angemeldet!
Seit Tagen steh ich vor einem großen Problem und weiß nicht, wie ich das lösen soll.

Ich habe eine Klasse geschrieben, die Funktionen hat, die auf andere Klassenfunktionen zugreift.
Wobei ich bei dieser Frage am Besten einfach mein Quellcode poste.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "menu.h"
#include "character.h"
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <fstream>

using namespace std;


void CMenu::init()
{
    mainmenu();
}
void CMenu::mainmenu()
{
    system("cls");
    cout << "1. New Game" << endl;
    cout << "2. Edit Character" << endl;
    cout << endl;
    cout << "0. Exit" << endl;
    bool bMenuactive = true;
    while ( bMenuactive == true )
    {
        int input = _getch();
        switch(input)
        {
            case(061): // Press 1
                {
                bMenuactive = false;
                newgame();
                }break;
            case(062): // Press 2
                {
                bMenuactive = false;
                editcharacter();
                }break;
            case(033):
            case(060): // Press 0 or ESC
                {
                exit(0); // Close program
                }break;
        }
    }
}
void CMenu::newgame()
{
    system("cls");
    cout << "PROTOTYP NEW GAME" << endl;

}
void CMenu::editcharacter()
{
    CPlayer Player; // <- Störfaktor
    bool bMenuactive = true;
    while ( bMenuactive == true )
    {
    system("cls");
    Player.ShowProfile();
    cout << "1. Change Name" << endl;
    cout << "2. Change Gender" << endl;
    cout << "3. Change Class" << endl;
    cout << endl;
    cout << "4. New Character" << endl;
    cout << endl;
    cout << "9. Back" << endl;

        int input = _getch();
        switch(input)
        {
            case(061):  // Press 1
                {
                Player.ChangeName();    // Function to change 
                }break;                 // Character Name
            case(062):  // Press 2
                {
                Player.ChangeGender();  // Function to change Gender
                }break;
            case(063):  // Press 3
                {
                Player.ChangeClass();   //Function to change Class
                }break;
            case(071):  // Press 9
                {
                bool bMenuactive = false;
                mainmenu();
                }break;
        }
    }
}



Eigentlich würde ich gerne die Klasse in einer Datei speichern. Doch wenn ich die Klasse ausserhalb der Klasse selber deklariere, spuckt er mir Fehler aus.
Meine Angst ist, dass die Klasse nur in der Funktion selber aktiv wird und ich dadurch sie beim Spiel selber nicht mehr verwenden kann.
Bevor ich noch eine "Wall of Text" hier hin donner, hat vielleicht jemand vielleicht schon das Problem erkannt und eine fixe Idee?

mit freundlichen Grüßen

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

2

17.11.2011, 20:05

Sorry, ich kann Dir nicht folgen...
Willst Du in einer der Methoden auf eine andere Klasse zugreifen? Dann übergib einen Pointer auf die Klasse und benutz diesen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
CMenu::CMenu(CPlayer* player)
{
   this->Player = Player;
}

...

void CMenu::editcharacter()//Alternativ den Kosntruktor belassen wie er ist und Player nur an die Funktion übergeben: void CMenu::editcharacter(CPlayer* Player)
{
...
*Player->ShowProfile();
...
}


Was meinst Du mit Speichern?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

17.11.2011, 20:30

Willkommen im Forum.

Was sind das denn für Fehlermeldungen? Nichtaufgelöste externe Symbole? Ohne Fehlermeldung und/oder ordentliche Fehlerbeschreibung können wir dir leider nicht helfen :(
Der Quellcode vom Spieler steht in einer .cpp Datei, die in dem Projekt eingetragen ist? Wenn nicht ist das der Fehler. Vielleicht musst du aber auch einfach nur die Headerdatei vom Spieler einbinden.(include ;))

Aufrufe von exit(); solltest du vermeiden. Du kannst einfach in der Mainmethode returnen.

Zeile 85 macht garnichts. Sicher, dass du eine neue Variable definieren willst?

Wieso schreibst du das so?
case(061): // Press 1
und nicht so
case('1'):
Dann wirds wär auch sofort klar, was da passiert :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (17.11.2011, 20:36)


KeyC

Frischling

  • »KeyC« ist der Autor dieses Themas
  • Private Nachricht senden

4

17.11.2011, 21:12

Das Programm hat bisher keine Fehlermeldungen.
Ich bekomme die Fehlermeldung "error C2065: 'Player': nichtdeklarierter Bezeichner" wenn ich Funktionen in anderen Bereichen aufrufe. (Selbst in der eigenen Klasse, wenn es schon deklariert ist/war.
Selbst wenn ich in der main.cpp den Spieler deklariere, kann ich ihn in der menu.cpp nicht verwenden.
Die Frage ist, wie ich Player deklarieren kann um es auch zukünftig in anderen .cpp's verwenden kann.

Zitat

Zeile 85 macht garnichts. Sicher, dass du eine neue Variable definieren willst?

Bisher habe ich keine andere Möglichkeit gefunden zwischen dem Hauptmenue und den Untermenue zu wechseln.
Wenn ich den Wert weglasse, kann ich das Programm nicht per return in der Main-Funktion beenden.

Zitat

Wieso schreibst du das so?
case(061): // Press 1
und nicht so
case('1'):
Dann wirds wär auch sofort klar, was da passiert

Wusste nicht, dass man so auch Zahlen übergeben kann. Und habs letzendlich wegen ESC gemacht, weil ich keinen anderen Weg gefunden habe
die Taste abzufragen ohne einen Code.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

17.11.2011, 21:30

Wenn ich dir richtig folgen kann dann solltest du einfach die Klasse Player per include einbinden. Das musst du in jeder Datei machen, die Player verwendet. Wenn du Player in main hinzufügst, heisst das nicht, dass du Player auch in anderen Datein einbinden kannst. Arbeitest du mit irgendeinem Buch?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

KeyC

Frischling

  • »KeyC« ist der Autor dieses Themas
  • Private Nachricht senden

6

17.11.2011, 21:59

Ja, ich habe das Buch C++ für Spieleprogrammierer 3. Auflage.
Was ich vergessen habe zu erwähnen ist, dass "character.h" die CPlayer Klasse beinhält, der Name ist wahrscheinlich etwas verwirrend udn sollte ich noch ändern

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

7

17.11.2011, 22:04

Mir ist eben noch aufgefallen, das in Zeile 86 indirekte Rekursion stattfindet. Das willst Du bestimmt nicht!

In welcher Zeile tritt die Fehlermeldung auf? Schreib doch bitte die gesamte Fehlermeldung hier rein.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

17.11.2011, 22:18

Jetzt checke ich dein Problem auch;) MCP hat dir eigentlich schon eine Antwort darauf gegeben. Was du machen solltest, ist CMenu einen CPlayer zu geben. Du erzeugst nicht einfach eine Instanz in einer Funktion, sondern die Klasse bekommt diese als Member.

edit: Es gibt keine Fehlermeldung. Nur wenn er außerhalb von editcharacter() auf Player zugreifen will, was ja auch normal ist, da Player nur innerhalb der Funktion existiert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

KeyC

Frischling

  • »KeyC« ist der Autor dieses Themas
  • Private Nachricht senden

9

17.11.2011, 22:49

Verstehe, ich probiere das mal mit dem Pointer, auch wenn ich damit noch sehr wenig Erfahrung habe.
Danke für die Tipps. Ich melde mich wieder, falls ich wieder festgefahren bin

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

18.11.2011, 13:46

Diese Zeile: bool bMenuactive = false;
Macht nichts weil du eine neue Variable definierst und mit false initialisierst. Dabei überschreibst du die die alte Variable bMenuactive. Lässt du das bool weg änderst du den Wert und die Schleife wird verlassen. Dann brauchst du die Rekursion, die MCP angesprochen hat auch nicht mehr.

Was du machen solltest, ist CMenu einen CPlayer zu geben. Du erzeugst nicht einfach eine Instanz in einer Funktion, sondern die Klasse bekommt diese als Member.

Der Spieler ist Teil des Menüs? Ich kenn zwar den restlichen Code nicht, aber das ist unlogisch.
Das Spiel besteht im Grunde doch nur aus Menüs oder nicht? Die einzelnen Untermenüs werden durch Methoden bereitgestellt. Ich glaube eine Gameklasse wäre besser geeignet.(CMenu einfach in CGame umbenennen :D)


@KeyC: Hast du schonmal drüber nachgedacht dir ein "Nachschlagewerk" zuzulegen?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige