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

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

11

19.02.2012, 21:44

Ja mit den NULL könntest du recht haben, mache dies auch nur sicherheitshalber, tut ja nicht weh das es da steht.

Das ist so als würdest du dir ein Pflaster auf den Daumen kleben, weil du dich ja verletzten könntest und den Daumen anschließend komplett abhacken und wegwerfen. Der Daumen ist in jedem fall weg, egal ob mit Pflaster oder ohne.

Ja der RessourcenManager wird in der Game Klasse erzeugt und das auf dem Stack und wird nur als Pointer an die Screens übergeben somit wird er automatisch zerstört wenn das Spiel geschlossen wird und damit ist kein delete nötig, zumindest nicht nach meiner Auffassung.

Ein weiterer Anwendungsfall für eine Referenz, diesmal als Member. Dazu benötigst du eine Initialisierungsliste, die du sowieso immer nutzen solltest. Also lohnt es sich sie anzuschauen. :thumbsup:
"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« (19.02.2012, 21:51)


storage

Treue Seele

  • »storage« ist der Autor dieses Themas

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

12

21.02.2012, 16:53

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.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »storage« (21.02.2012, 17:14)