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

23.04.2013, 17:07

State Manager

Hallo zusammen,

ich habe da meine Verständnisfrage.

Ich arbeite der Zeit an einem State Manager in C++, da ich mein erstes Spiel (einem Moorhuhn-Klon mit SFML) um ein Hauptmenü etc. erweitern wollte.

Dieser funktioniert soweit auch ganz gut!

Mein Ziel war es, diesen soweit es geht ohne Zeiger zu realisieren.

Nur leider ist dies nicht? möglich...

Ich habe eine Klasse (StateManager), in dem die einzelnen States in einer map gespeichert werden.
Und eine Klasse (States), die die Platzhalter wie HandleEvent (), Update () und Render () für die Vererbung beinhaltet.

Wenn ich nun beispielsweise meine Klasse für das Menü erstelle, mit der Vererbung von CStates, hab ich sie wie folgt im StatesManager anlegt (ich fasse mal kurz das wichtigste zusammen):

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
CStates                                                 m_ActualState;
CMenu                                                   m_MenuState;

std::map<std::string, CStates>              m_StatesList;
std::map<std::string, CStates>::iterator   it;

// Funktionen zum hinzufügen neuer States und zum setzen des aktiven

void AddState (std::string ID, CStates &State)
{
        it = m_StatesList.find (ID);

        if (it != m_StatesList.end ())
        {
                // ID schon vorhanden
        }

        m_StatesList[ID] = State;
}

void SetState (std::string String)
{
it = m_StatesList.find (ID);

        if (it != m_StatesList.end ())
        {
            m_ActualState.InitState ();
            m_ActualState = it->second;
            m_ActualState.ExitState ();
        }
}

// Menu erstellen und als aktiv setzen
AddState ("Menu", m_MenuState);
SetState ("Menu");


Könnt ihr mir erklären, wieso das "so" nicht funktioniert, aber wenn ich das mit Zeigern realisiere:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
CStates                                                 *m_ActualState = new CStates;
CMenu                                                   *m_MenuState = new CMenu;

std::map<std::string, CStates*>             m_StatesList;
std::map<std::string, CStates*>::iterator   it;

void AddState (std::string ID, CStates *State)
{
        // usw....


schon?

Ich hoffe ich konnte meine Frage ansatzweise verständlich rüberbringen.

Vielen Dank.

Gruß

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

23.04.2013, 17:31

Vor allem ist es bei einer std::map total unnötig zu schauen, ob das Ding schon drin ist, denn das macht std::map::insert ohnehin schon!
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]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

23.04.2013, 17:33

Deine Frage und auch deine Worte oben (von wegen ohne Zeiger arbeiten) zeigen, dass dir da noch das Verständnis fehlt. Zeiger sind nun mal wichtig. Die brauchst du im Prinzip überall beim programmieren. Die Leute schrecken davor gern zurück, aber dabei sind die eigentlich gar nicht schwer. Setz dich einfach hin und lies dir die Kapitel zu Zeiger und Referenzen in deinem Buch noch mal durch. Immer schön Beispielaufgaben machen ist auch wichtig. Wenn du dann konkrete Fragen zu Zeigern hast kannst du die gern stellen. Ansonsten gehts hier aber echt um grundlegende Verständnisfragen. So weit geht es nun mal nicht. Wie gesagt, lies dich noch mal in das Thema ein und wenn du dann etwas zu Zeigern nicht verstehst, mach einen neuen Thread und stell konkrete Fragen.
„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.“

4

23.04.2013, 19:35

Ich danke erstmal für die Antworten!

Es ist nicht so, dass ich nicht weis, wie man Zeiger verwendet.
Vielleicht habe ich auch einige alte Threads hier missverstanden, in denen oft geraten wurde, keine Zeiger zu verwenden.

Ich werde das Kapitel auf jeden Fall nochmal durcharbeiten, aber dann in meinem neuen Buch (Einführung in die Programmierung mit C++).

Also ist es durchaus legitim, dass ich mit Zeiger arbeite?

Gruß

5

23.04.2013, 19:53

Also ist es durchaus legitim, dass ich mit Zeiger arbeite?


Nicht nur das, in dem Fall geht es gar nicht anders. Man merkt einfach wann Zeiger, wann Referenz und wann Smart-pointer, wenn man das Konzept dahinter verstanden hat.

Ok, vielen Dank! :)

6

23.04.2013, 20:11

Also ist es durchaus legitim, dass ich mit Zeiger arbeite?
Nur um das mal klar zu stellen: Du solltest mit Zeigern programmieren, das ist evt. einer der Gründe warum man sich C++ aussucht 8)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

23.04.2013, 22:49

Achso? Man sucht sich C++ aus, weil es Zeiger hat? Finde ich einen ungewöhnlichen Gedanken, kannst Du das erläutern?
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]

8

23.04.2013, 22:54

Achso? Man sucht sich C++ aus, weil es Zeiger hat? Finde ich einen ungewöhnlichen Gedanken, kannst Du das erläutern?
Bitte korrigiere mich, falls ich Mist reden sollte, aber ich finde, das man eine Vielzahl von Problemstellungen mit Zeigern schneller(bzw. kürzer) und eleganter lösen kann.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

9

24.04.2013, 00:20

Achso? Man sucht sich C++ aus, weil es Zeiger hat? Finde ich einen ungewöhnlichen Gedanken, kannst Du das erläutern?
Bitte korrigiere mich, falls ich Mist reden sollte, aber ich finde, das man eine Vielzahl von Problemstellungen mit Zeigern schneller(bzw. kürzer) und eleganter lösen kann.

Zeiger bzw. allgemein das Konzept dahinter gibt es ja nicht nur in C++ - darauf wollte er wohl hinaus ;).


@OP:
Mach' dir nicht so viele Gedanken, ob dein Programm legitim ist oder ob das andere nicht schöner gelöst hätten. Man könnte dir jetzt eine Bandbreite von Dingen sagen, die du anders machen könntest. Aber darum gehts nicht, es geht darum, dass DU das erkennst und verstehst. Und das kannst du nicht, wenn du nicht weißt, wie es anders funktioniert. (Man weiß nicht, was man von einer Lösung hat, wenn man das Problem nicht kennt).

Wenn es funktioniert und dich zufriedenstellt, dann ist es gut. Und irgendwann, vielleicht schon beim nächsten Feature, das du einbauen willst, denkst du dir: "Moment, das sollte ja alles ganz anders aussehen..." :)
WIP Website: kevinheese.de

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

24.04.2013, 07:29

Achso? Man sucht sich C++ aus, weil es Zeiger hat? Finde ich einen ungewöhnlichen Gedanken, kannst Du das erläutern?
Bitte korrigiere mich, falls ich Mist reden sollte, aber ich finde, das man eine Vielzahl von Problemstellungen mit Zeigern schneller(bzw. kürzer) und eleganter lösen kann.
C# hat außer in unsafe-Kontexten keine Zeiger. Java hat gar keine Zeiger. Trotzdem sind die selben Konzepte dort genauso nutzbar. Ich versteh also nicht ganz, warum man sich wegen Pointern explizit für C++ entscheiden muss.
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]

Werbeanzeige