Von einem Enum erben

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Von einem Enum erben

Beitrag von Schrompf »

Guten Tag, verehrte Herren.

Ich möchte gern einen Enum erstellen, der alle Werte eines anderen Enums übernimmt und hintendran weitere Werte anfügt. Geht das in C++ irgendwie? Optionaler Fakt: Visual Studio 2010. Aber da die 2012 ja auch wieder WinXP unterstützen wird, kann ich auch mit C++11-Lösungen leben, die mit VS10 noch nicht gehen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Von einem Enum erben

Beitrag von dot »

Folgender Vorschlag:

Code: Alles auswählen

struct bla
{
  enum first
  {
    A,
    B
  };
};

struct bli : bla
{
  enum second
  {
    C,
    D
  };
};

int main()
{
  bli::A;
}
Da ist es ausnahmsweise mal nützlich, dass enumerators in den äußeren scope spillen...
Zuletzt geändert von dot am 18.07.2012, 14:51, insgesamt 1-mal geändert.
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Von einem Enum erben

Beitrag von Matthias Gubisch »

Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: Von einem Enum erben

Beitrag von klickverbot »

dot hat geschrieben:Folgender Vorschlag:

Code: Alles auswählen

struct bla
{
  enum first
  {
    A,
    B
  };
};

struct bli : bla
{
  enum second
  {
    C,
    D
  };
};
Das dürfte nicht funktionieren, wenn du eine Variable/einen Parameter vom Typ bli::second anlegen willst, oder übersehe ich etwas?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Von einem Enum erben

Beitrag von Schrompf »

Interessante Ideen, Danke. Wenn ich mich geistig einfach davon verabschiede, dass der Typ ein richtiger Enum sein soll, ist das Problem plötzlich sehr viel einfacher. Ein size_t in eine Template-Klasse gewrappt sollte da prima funktionieren.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Von einem Enum erben

Beitrag von dot »

klickverbot hat geschrieben:Das dürfte nicht funktionieren, wenn du eine Variable/einen Parameter vom Typ bli::second anlegen willst, oder übersehe ich etwas?
Stimmt, daran hab ich jetzt auf die Schnelle nicht gedacht. Da müsste man wohl mit int und Casts was hacken, was vermutlich genau das ist, was der template Kram aus dem verlinkten Artikel tut...

Daher frag ich lieber mal Schrompf: Wofür genau brauchst du das eigentlich?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Von einem Enum erben

Beitrag von Schrompf »

Kontext: meine kleine GUI-Bibliothek nimmt bisher nur Tasten mit Bedeutung als Ereignisse an. Also anstatt konkreten Tasten wie "Pfeiltaste Links" oder "Escape" werden als Input nur Bedeutungen wie "nach links" oder "Abbruch" akzeptiert. Das ist prima für konfigurierbare Tastenzuordnungen und erlaubt auch stressfrei die Bedienung der GUI mit GamePads. Nun brauche ich aber für den aktuellen Auftrag aber komplexere Tasten-Shortcuts und wollte deswegen einfach meinen kleinen Tasten-Enum um alle Tasten von OIS erweitern. Die eigenen Tasten hätte ich dann irgendwo in einen abschüssigen Zahlenbereich gelegt. Da aktuell alle Logik mit konkreten Enum-Werten arbeitet, wäre das eine abwärtskompatible Erweiterung gewesen, die das Problem einfach und schnell gelöst hätte.

Randbemerkung: ich habe mein ganzes Framework und die Dependencies endlich mal in ein eigenes Repository rausgezogen und per svn:external in jedes Projekt eingebunden. Erspart mir ne Menge Sync-Arbeit. Ich ärgere mich, dass ich das nicht schon viel früher gemacht habe.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Von einem Enum erben

Beitrag von dot »

hm...vielleicht was in der Richtung:

Code: Alles auswählen

class Key
{
private:
  int key;

public:
  Key(DeinKeyEnum key)
    : key(key)
  {
  }

  Key(OISKeyEnum key)
    : key(key)
  {
  }

  operator int() const { return key; }
};
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Von einem Enum erben

Beitrag von Schrompf »

Jupp, genau sowas. Danke für die Ideen!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten