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

10.05.2009, 17:10

Namespace und Enumerations!

Hiho! Ich stehe oft an der Frage, welchen Namen ich meiner Enumeration geben sollte. Dann bin ich vorhing auf eine kleine Idee gekommen:

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
namespace MultiSampleCount
{
    enum _MultiSampleCount 
    { 
        None    = 0,
        Two     = 2,
        Four    = 4,
        Eight   = 8,
        Sixteen = 16, 
    };
};

namespace RefreshInterval
{
    enum _RefreshInterval
    {
        Immediate = 0,
        One       = 1,
        Two       = 2,
        Three     = 3,
        Four      = 4,
    };
};

using namespace MultiSampleCount;
using namespace RefreshInterval;


Ich habe immer das Problem das meine Member der Enumeration oft bereits in anderen vorhanden sind, deswegen musste ich denen immer einen präfix geben, was mir nie gefallen hat. Nun habe ich mir gedacht, einfach um jede enumeration einen namespace mit dem selben namen zu packen. Wenn ich nun an einer Funktion etwas übergeben will, dann sieht das so aus:

SetMultiSample(MultiSampleCount::Eight, 0);

Als präfix hat man dann so zu sagen den Namespace, was den Vorteil hat das es wie ich finde übersichtlicher ist, und das wenn man die beiden Doppelpunkte eingibt auch sofofrt sieht welche enumerations es alles gibt.

Mich Interesseirt was ich von der variante haltet?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

10.05.2009, 17:26

Die Enumeration gehört ja irgendwohin und dann würde ich das dort in den Scope packen.. Aber wenn es sein muss, kann man das schon auch so machen.. Mir gefallen enums sowieso nicht so. Mal schauen, wie es dann mit dem neuen Standard aussieht..

3

10.05.2009, 19:45

Ich wünsche mir vieles aus C# in den neuen standart, am meisten wünsche ich mir die foreach schleife und deren enumerations, denn da können die Namen auch mehrmals gleich sein, man muss nur immer den enumeranten davor schreiben :)

Bin auch schon oft am überlegen auf C# um zu steigen, aber es hat wie ich finde zu viele "schwerwiegende" Nachteile.

Mir selbst gefallen enumerations auch nicht so wirklich, aber haben halt den vorteil, das man gezwungen ist das richtige zu übergeben, und nicht irgent nen wert der garnicht exitiert. Ansonsten benutze ich immer sowas hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class MultiSampleType
{
public:
    static const unsigned int None    = 0;
    static const unsigned int Two     = 2;
    static const unsigned int Four    = 4;
    static const unsigned int Eight   = 8;
    static const unsigned int Sixteen = 16;
};


#define gefällt mir überhaupt nicht, weil ich möchte nicht so viel schreiben und immer wieder naschauen müssen, stattdessen benutze ich sowas, dann werden einem schon alle möglichen werte angezeigt, die man verwenden kann.

4

10.05.2009, 20:13

Zitat von »"Deppomat"«

am meisten wünsche ich mir die foreach schleife
BOOST_FOREACH.

Zitat von »"Deppomat"«

und deren enumerations, denn da können die Namen auch mehrmals gleich sein, man muss nur immer den enumeranten davor schreiben :)
C++09. Und bis dahin: Workaround durch Namespace oder Struct innerhalb der Klasse.

Zitat von »"Deppomat"«

Ansonsten benutze ich immer sowas hier:
Welchen Vorteil hat das gegenüber enum? Wenn schon, würde ich innerhalb der Klasse ein enum (je nachdem ohne Namen) definieren.

Zitat von »"Deppomat"«

#define gefällt mir überhaupt nicht, weil ich möchte nicht so viel schreiben und immer wieder naschauen müssen, stattdessen benutze ich sowas, dann werden einem schon alle möglichen werte angezeigt, die man verwenden kann.
Den Zusammenhang mit dem Präprozessor verstehe ich jetzt nicht ganz. Aber #define wird in modernem C++ sowieso nicht für Konstanten verwendet.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

10.05.2009, 20:47

Wer C#-Features will, der soll C# Programmieren ;)
Ehrlich gesagt frage ich mich bei deiner Frage nach dem Sinn. Ein Namespace ist im Normalfall größer und enthält nicht nur eine Klasse oder eine Enumeration. Und damit lässt sich ein solches Problem sehr einfach lösen. Denn was nutzen dir denn deine 10 Namspaces für 10 Enumerations. Da kannst du dir die Namespaces auch sparen.

6

10.05.2009, 20:53

Zitat von »"Fred"«

Ein Namespace ist im Normalfall größer und enthält nicht nur eine Klasse oder eine Enumeration. Und damit lässt sich ein solches Problem sehr einfach lösen. Denn was nutzen dir denn deine 10 Namspaces für 10 Enumerations. Da kannst du dir die Namespaces auch sparen.
#
es geht darum, das er in verschiedene enums elemente mit demselben namen tun will, also ein präfix für die elemente braucht. Und statt das als teil des elementbezeichners dazu zu schereiben, packt er lieber jede enum in einen spezialisierten namespace, der auch nur für diese enum da ist ;)

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

7

10.05.2009, 20:56

Ah dann habe ich das Problem missverstanden. Sorry ;)
Ich pflege im Normalfall mit Prefixen zu arbeiten. Das ist imo der übersichtlichste und einfachste Weg

8

10.05.2009, 22:10

Zitat

C++09. Und bis dahin: Workaround durch Namespace oder Struct innerhalb der Klasse.


Ich verstehe nicht ganz was du damit meinst, hasst du dich vieleicht versprochen und meinst enumeration anstatt Klasse? Wenn ja dann soll ich einfach die Member der enumeration in eine unbenannte Struktur stecken?

Zitat

Welchen Vorteil hat das gegenüber enum? Wenn schon, würde ich innerhalb der Klasse ein enum (je nachdem ohne Namen) definieren.


Daran habe ich auch noch nicht gedacht, danke für den Hinweis! Bei mir würde das dann so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class PrimitiveType
{
public:
    static const enum Enum
    {
        PointList     = 0,
        LineList      = 1,
        LineStrip     = 2
        TriangleList  = 3,
        TriangleStrip = 4,
        TriangleFan   = 5,
    };
};


Die Member können mehrmals vorkommen, hat aber noch einen nachteil, mit dem man aber gut leben kann. Wenn ich nun eine Funktion declariere, die diese Enumeration als Parameter hat, muss das so aussehen:

C-/C++-Quelltext

1
bool DrawPrimitiveUP(PrimitiveType::Enum primitiveType, ...... );

9

10.05.2009, 23:00

Zitat von »"Deppomat"«

Ich verstehe nicht ganz was du damit meinst, hasst du dich vieleicht versprochen und meinst enumeration anstatt Klasse? Wenn ja dann soll ich einfach die Member der enumeration in eine unbenannte Struktur stecken?

Nein, ich meinte schon Klasse. Es ging darum, wenn du enums als Typen innerhalb von Klassen willst.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Raumschiff
{
    // ...


    struct Kategorie
    {
        enum Typ
        {
            Jäger,
            Korvette,
            Kreuzer,
            Sternenzerstörer,
        };
    };
};

Mögliche Verwendung:

C-/C++-Quelltext

1
int Schaden = BerechneSchaden(Raumschiff::Kategorie::Kreuzer);

Oder innerhalb von Klassen-Memberfunktionen:

C-/C++-Quelltext

1
int Schaden = BerechneSchaden(Kategorie::Kreuzer);

Aber wie gesagt ein Workaround, meiner Ansicht nach kein besonders schöner. Ich würde ihn eigentlich nur verwenden, wenn ich eine klare Abgrenzung möchte und ein Ausschütten in den Klassen-Namensraum verhindern will. Sonst kann man ein enum direkt in der Klasse definieren und spricht die Enumeratoren eben über Raumschiff::Kreuzer an.


Zitat

Daran habe ich auch noch nicht gedacht, danke für den Hinweis! Bei mir würde das dann so aussehen: [...]
Die Member können mehrmals vorkommen, hat aber noch einen nachteil, mit dem man aber gut leben kann. Wenn ich nun eine Funktion declariere, die diese Enumeration als Parameter hat, muss das so aussehen: [...]

Ohne static const. Und ich verstehe dein Problem nicht ganz - wenn du den Klassennamen nicht angeben willst, definiere doch das Enum ausserhalb der Klasse?

10

11.05.2009, 00:13

Zitat

wenn du den Klassennamen nicht angeben willst, definiere doch das Enum ausserhalb der Klasse?


Nein gerade das will ich ja :D

Kurz ausgedrückt suche ich eine erstatz für enum, der genau das selbe beweirkt, dessen Namen der enum Member aber merhmals vorkommen kann.

Werbeanzeige