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

xyqa

Frischling

  • »xyqa« ist der Autor dieses Themas

Beiträge: 16

Beruf: Schüler

  • Private Nachricht senden

1

30.06.2012, 19:00

Globale enum-Aufzählung C++

Hallo Leute,

ich bin's mal wieder. Ich stehe im Moment vor dem Problem eine globale enum-Aufzählung zu erstellen. Mein Projekt besteht aus mehreren Klassen in verschiedenen Dateien. Ich habe nun die Aufzählung in der Datei main.cpp vor die main-Funktion. Innerhalb der Datei kann ich nun auch gut auf die Aufzählung zugreifen. Jedoch habe ich in einer anderen Datei im selben Projekt keinen Zugriff. Ich habe schon ein bisschen mit dem Wort extern herumexperimentiert. Jedoch weiß ich nicht 100% ob und wie ich das Schlüsselwort in Bezug auf enum verwenden kann.

Ich hoffe ich habe mich nicht zu kompliziert ausgedrückt.

Gruß xyqa
Eine der wichtigsten Erfahrungen als Programmierer: Wenn alles auf Anhieb funktioniert hat man definitiv etwas falsch gemacht ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

30.06.2012, 19:05

Da es Konstanten sind kannst du sie Problemlos in eine .h packen und diese überall einbinden wo du das Enum benötigst. Es ist empfehlenswert das Enum in einen Namespace zu packen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
namespace Fischarten
{
    enum
    {
        KARPFEN,
        SCHWEIN,
        PFERD
    };
}
"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?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

30.06.2012, 20:00

Geht technisch wie NachoMan erklärt hat, klingt für mich aber nach einem Design-Fehler.
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

30.06.2012, 21:16

Ich glaube xyqa befindet sich noch in einem Stadium, in dem er sich noch keine Gedanken über das Design macht, sondern erstmal die Sprache richtig lernen muss. ;)
"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?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

30.06.2012, 21:28

Trotzdem kann man ihm ja sagen, dass er das Konzept eventuell überdenken sollte.
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]

xyqa

Frischling

  • »xyqa« ist der Autor dieses Themas

Beiträge: 16

Beruf: Schüler

  • Private Nachricht senden

6

01.07.2012, 12:20

Erst schon mal vielen Dank für die schnellen Antworten. :) Ich werde das gleich mal ausprobieren.

Ihr habt zwar recht das ich in meinem Stadium noch nicht sehr weit bin (ich beherrsche die Dinge aus dem Buch C++ für Spieleprogrammierer halbwegs und bin dabei ein kleines Spiel mit sehr einfacher Grafik zu programmieren. Mehr geht aber noch nicht). Ich würde mich aber trotzdem dafür interessieren, was ihr mit dem angesprochenen Designfehler meint.
Eine der wichtigsten Erfahrungen als Programmierer: Wenn alles auf Anhieb funktioniert hat man definitiv etwas falsch gemacht ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

01.07.2012, 12:39

Aufzählungen werden oft genutzt und zwischen verschiedenem Verhalten zu wählen.
Das sieht dann so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void machWas()
{
    if(meineArt == FISCH)
    {
        schwimmen();
    }
    else if(meineArt == VOGEL)
    {
        fliegen();
    }
    else if(meineArt  == SAEUGETIER)
    {
        laufen();
    }
}

Oder halt mit switch-case. Das ist auf dauer nicht besonders flexibel und fehleranfällig. Für einen Anfänger aber völlig in Ordnung. Jeder fängt mal klein an.

Eine schönere Lösung wäre man mit Vererbung und virtuellen Methoden zu erreichen.
Das sieht dann in etwa so aus:

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
#include <iostream>

class Tier
{
    virtual void bewegen() = 0;
public:
    void machWas()
    {
        /*...*/
        bewegen();
        /*...*/
    }
};

class Fisch : public Tier
{
    void schwimmen()
    {
        std::cout << "Ich schwimme" << std::endl;
    }

    virtual void bewegen()
    {
        schwimmen();
    }
};

class Vogel : public Tier
{
    void fliegen()
    {
        std::cout << "Ich fliege" << std::endl;
    }

    virtual void bewegen()
    {
        fliegen();
    }
};

class Saeugetier : public Tier
{
    void laufen()
    {
        std::cout << "Ich laufe" << std::endl;
    }

    virtual void bewegen()
    {
        laufen();
    }
};

void tolleFunktion(Tier &tier)
{
    tier.machWas();
}

int main()
{
    Saeugetier laeufer;
    Vogel flieger;
    Fisch schwimmer;

    tolleFunktion(laeufer);
    tolleFunktion(flieger);
    tolleFunktion(schwimmer);

    std::cin.get();
    return 0;
}


Das sieht auf dem ersten Blick viel komplizierter und aufwändiger aus. Hast du aber komplexere Funktionen als "tolleFunktion" sparst du dir eine Menge Arbeit. Damit ist auch noch viel mehr möglich.
Dazu empfehle ich dir ein gutes Handbuch, Effective C++ und Designpatterns zu lesen. :D

Edit: Übrigens weiß ich, dass es Vögel gibt die nur Laufen und Säugetiere die auch Fliegen können gibt. ;)
"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« (01.07.2012, 12:47)


xyqa

Frischling

  • »xyqa« ist der Autor dieses Themas

Beiträge: 16

Beruf: Schüler

  • Private Nachricht senden

8

01.07.2012, 13:05

Ahh okay. Ja ich glaube ich versteh so ungefähr was du meinst. Jedoch geht es bei meiner Aufzählung um die verschiedenen Spielstadien (Intro, Hauptmenü, Spiel). Ich verzweige dann je nach Stadium so wie du in dem ersten Beispiel.
Eine der wichtigsten Erfahrungen als Programmierer: Wenn alles auf Anhieb funktioniert hat man definitiv etwas falsch gemacht ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

01.07.2012, 13:08

Das gleiche Funktioniert auch mit Spielstadien.
Dazu gibt es sogar einen Artikel in unserer Wiki: https://www.spieleprogrammierer.de/wiki/…stand-Automaten

Aber wie gesagt. Für Anfänger ist es keine Schande sowas erstmal nicht zu nutzen. Lass dir beim Üben nicht vorschreiben wie du ein Problem zu lösen hast. Mach es erst so wie du am besten damit klar kommst, das ist oft schon schwer genug.
Wenn du versuchst alles perfekt zu machen blockierst du dich nur selbst und kommst garnicht voran.
"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?

xyqa

Frischling

  • »xyqa« ist der Autor dieses Themas

Beiträge: 16

Beruf: Schüler

  • Private Nachricht senden

10

01.07.2012, 13:11

Danke für den Hinweis. Werde mich bei Gelegenheit damit beschäftigen. Für mein aktuelles Projekt benutze ich jedoch erst mal die einfache Variante, da mein primäres Ziel ist erst mal ein eigenes Spiel zum laufen zu bekommen ;)
Eine der wichtigsten Erfahrungen als Programmierer: Wenn alles auf Anhieb funktioniert hat man definitiv etwas falsch gemacht ;)

Werbeanzeige