Ich habe jetzt nochmal eine Frage, wollte jetzt nicht extra nen neuen Thread aufmachen auch wenn es ein allgemeines Thema ist.
Ich habe ja eine Basisklasse "RenderScreen" welche virtuelle Funktionen enthält, welche in den abgeleiteten Klassen implementiert werden.
|
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
|
#include <SFML\Graphics.hpp>
#include "RessourceManager.h"
#ifndef RENDERSCREEN_H
#define RENDERSCREEN_H
enum ScreenState {
IDLE,
ACTIVE,
PAUSE,
UNDEFINED
};
class RenderScreen
{
protected:
RessourceManager &m_rRessources;
int m_iState;
public:
RenderScreen(RessourceManager &resMgr, ScreenState state);
virtual ~RenderScreen(void);
virtual void Update(const float elapsedTime) = 0;
virtual void Render(sf::RenderWindow &window) = 0;
const int GetState(void);
void SetState(ScreenState state);
};
#endif
|
Jetzt habe ich eine abgeleitete Klasse "StartScreen" welche eben auch ein Menü zum auswählen von "Start Game" und "Exit game" erlaubt.
Durch das Menü ergibt sich eine öffentliche Funktion "GetSelectedMenuEntry()" welche von meiner "Game" Klasse in einer gleichnamigen Funktion
aufgerufen werden soll. Jetzt ist ja die Sache das in meiner "Game" Klasse alle Screens in einer Map vom Typ <std::string,RenderScreen*> sind
und ich damit keinen Zugriff auf die Funktion "GetSelectedMenuEntry()" in der Abgeleiteten Klasse "StartScreen" habe.
Mein versuch ist jetzt so:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
const int Game::GetSelectedMenuEntry(void)
{
std::map<std::string, RenderScreen*>::iterator it = this->m_lScreens.find("start");
if (it != this->m_lScreens.end())
{
StartScreen *menu = (StartScreen*)it->second;
return menu->GetSelectedMenuEntry();
}
return -1;
}
|
Ist dies der richtige Weg oder gibt es da schönere Lösungen und wie sieht es mit dem Zeiger menu aus, muss ich den wieder freigeben und das somit so abändern.
Edit: Das hier ist definitiv nicht notwendig, da ich ja sonst den "StartScreen" aus den speicher lösche also muss ich delete nicht ausführen. (war verwirrt)
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
const int Game::GetSelectedMenuEntry(void)
{
std::map<std::string, RenderScreen*>::iterator it = this->m_lScreens.find("start");
if (it != this->m_lScreens.end())
{
StartScreen *menu = (StartScreen*)it->second;
int entry = menu->GetSelectedMenuEntry();
delete menu;
return entry;
}
return -1;
}
|
Ich danke schon mal.