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

13.06.2010, 17:14

Probleme mit Klassen

Hallo, ich bin gerade dabei mein aktuelles Projekt "aufzuräumen", da es doch recht groß geworden ist und einfach unübersichtlich geworden ist.

Nun habe ich aber irgendwie ziemliche Probleme dabei.
Ich habe verschiedene Klassen in verschiedenen header Dateien. Nun kommt es öfters mal vor, dass ich z.B. von einer Methode der Klasse A auf eine Variable der Klasse B zugreifen muss. In meiner unaufgeräumten Version hatte ich diese Variablen auf die ich von "überall" aus zugreifen möchte einfach als static definiert. Das klappte aber ich denke mir das das wohl nicht der Sinn der Sache ist.

Ich würde das ganze gerne sauberer machen. Habe dann versucht mit Instanzen der Klassen zu arbeiten, was aber zu Problemen führte. Die Variablen waren eben nur in der jeweiligen Instanz richtig gesetzt.

Jetzt habe ich es so versucht:
Ich habe mir in Klasse A einen Zeiger auf Klasse B erstellt:

C-/C++-Quelltext

1
CGame* m_pCGame;    //Zeiger auf CGame Klasse


Und hatte nun gehofft das ich mit

C-/C++-Quelltext

1
m_pCGame->...;


auf die Variablen zu greifen kann.
Dadurch stürzt die Anwendung aber ab. Was hab ich hier falsch gemacht?

Irgendwie sollte ich mich wohl nochmal genau mit Klassen beschäftigen...

Ich dachte dann auch an Set Methoden aber bei sehr vielen Variablen stell ich mir das zu umständlich vor.

Naja, kann mir jemand mal auf die Sprünge helfen wie ich das ganze am besten angehe und Ordnung in mein Projekt kriege? Am besten wäre es wohl wenn ich gar nicht auf Variablen fremder Klassen zugreife aber das lässt sich nicht komplett vermeiden, denke ich.

Danke schon mal.

idontknow

unregistriert

2

13.06.2010, 17:49

Nullpointer? Du hast einen Pointer auf eine Klasse vom Typ CGame, aber der zeigt momentan auf nichts. Zumindest schauts so aus!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

13.06.2010, 17:50

Das Objekt m_pCGame verweist auf kein gültiges Objekt. Da fehlt noch so etwas, wie :

C-/C++-Quelltext

1
m_pCGame = new CGame;


Allerdings vermute ich, dass du ein anderes Problem hast. Zeig mal genau (an einem Beispiel) was du haben willst.

@idontknow:
Das muss kein Null Pointer sein, da er den Zeiger nicht initialisiert kann der Zeiger jeden Wert haben.

4

13.06.2010, 17:50

Ja das klingt logisch, vielleicht sollte ich doch einfach bei static bleiben?!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

13.06.2010, 17:52

Nein. Zeig lieber was du genau machen willst.

6

13.06.2010, 17:56

Ok also ich versuch mal ein Bespiel zu geben:

Ich habe eine Klasse CGame.
In dieser gibt es zum Beispiel die Methode Init, in der ich auf die Variablen der Klasse leicht zugreifen kann:

C-/C++-Quelltext

1
2
3
4
5
6
class CGame
{
public:
int         turn; //Wer ist am Zug? 1-8
//...
};


C-/C++-Quelltext

1
2
3
4
5
tbResult CGame::Init()
{
turn = 1;
//..
}


Nun habe ich noch eine Klasse CMainMenu in der ich mir einen Zeiger auf CGame erstellen wollte:

C-/C++-Quelltext

1
2
3
4
5
6
class CMainMenu
{
public:
    CGame* m_pCGame;    //Zeiger auf CGame Klasse
//...
};


Und eine Methode Host in der ich nun den Zeiger nutzen möchte:

C-/C++-Quelltext

1
2
3
4
5
6
void CMainMenu::Host()
{
//...
m_pCGame->turn++;
//...
}


CGame und CMainMenu befinden sich in verschiedenen header Dateien.

Aber es wird wohl einfach daran liegen, dass m_pCGame auf nichts zeigt...

Wenn ich folgendes versuche:

C-/C++-Quelltext

1
2
3
4
5
6
void CMainMenu::Host()
{
//...
CGame::turn++;
//...
}


krieg ich natürlich nen compiler Fehler, wegen Zugriff auf nicht-statisches Element.


Wenn ich nun

C-/C++-Quelltext

1
m_pCGame = new CGame; 


mache, dann müsste das zwar klappen aber die Variable ist dann ja nur für dieses Objekt gesetzt.
Während m_pCGame->turn den richtigen Wert hätte, hätte CGame::turn diesen ja nicht.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Grabgewalt« (13.06.2010, 18:02)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

13.06.2010, 18:32

mache, dann müsste das zwar klappen aber die Variable ist dann ja nur für dieses Objekt gesetzt.
Während m_pCGame->turn den richtigen Wert hätte, hätte CGame::turn diesen ja nicht.


Auf m_pCGame->turn kann jeder, der Zugriff auf m_pCGame hat zugreifen, egal von wo aus. Zur Not kannst du m_pCGame auch global machen (so ist es in Breakanoid). Falls der Compiler deine Klassen nicht an jedem Ort kennt, musst du die entsprechende Headerdatei eben noch in die jeweilige Unit einbinden.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

8

13.06.2010, 19:12

@Grabgewalt:

Damit eine andere Klasse Zugriff auf den "Speicherblock" des instanzierten Objekts hat, gib der Klasse einfach einen Zeiger und dem Zeiger die Adresse des erstellten Objekts!

C-/C++-Quelltext

1
2
3
4
5
6
class CMainMenu
{
// ...
    CGame* m_pCGame;
// ...
}


Und in welcher Funktion du den entsprechenden Wert übergibst, bleibt ja dir überlassen :P
WIP Website: kevinheese.de

9

19.06.2010, 15:17

Habe mich nun doch entschieden das ganze über Set und Get Methoden zu realisieren. So kann ich den Großteil der Klassenvariablen als private deklarieren was Stil-mäßig wohl besser ist. Außerdem habe ich für größere Teile meine Projektes neue Klassen angelegt wodurch das ganze nun wesentlich übersichtlicher ist.

Danke für eure Hilfe.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

19.06.2010, 16:13

So kann ich den Großteil der Klassenvariablen als private deklarieren


du solltest ALLE als private deklarieren.
"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