public enum einer Klasse ausserhalb verwenden
-
SeboStone schrieb:
Eine Bedeutung haben sie nicht, aber einen Zweck, denn es existiert eine Klasse namens Error. Mit den Unterstrichen bekomme ich also eine dezente aussehende Eindeutigkeit, statt Syntaxfehlern.
Die Eindeutigkeit hast du schon durch den Namensraum der Klasse gegeben. Außerhalb der Klasse in dem der enum deklariert wurde musst du eh Klassenname::Enumwert schreiben.
cu André
-
SeboStone schrieb:
Hi!
Das hatte ich auch schon probiert, wollte aber ebenfalls nicht, da ich das enum nicht direkt in der Klassendefinition hatte, sondern dort nur die public Deklaration. Ich habe diesen Umstand nun also geändert, nun funzt des. Danke!
Häh, was meinst du damit? Um das enum nutzen zu können, reicht die Definition in der Klassendeklaration völlig aus - natürlich muß dort, wo sie verwendet werden sollen, auch die komplette Klasse bekannt sein (Forward-Deklaration "class CLog;" reicht nicht aus, um den enum nutzen zu dürfen).
PS: Der Compiler kann sehr wohl unterscheiden zwischen der Klasse Error und dem enum-Wert CLog::Error (zumindest solange Error nicht als Subklasse von CLog angelegt ist)
-
asc schrieb:
Die Eindeutigkeit hast du schon durch den Namensraum der Klasse gegeben. Außerhalb der Klasse in dem der enum deklariert wurde musst du eh Klassenname::Enumwert schreiben.
Klar, wenn man ihn auch innerhalb der Klasse immer angeben will. Evolutionär gibts nun auch noch für jeden der enum Einträge eine Funktion, nun müssen die enum Elemente ander heissen.
-
SeboStone schrieb:
asc schrieb:
Die Eindeutigkeit hast du schon durch den Namensraum der Klasse gegeben. Außerhalb der Klasse in dem der enum deklariert wurde musst du eh Klassenname::Enumwert schreiben.
Klar, wenn man ihn auch innerhalb der Klasse immer angeben will.
Innerhalb der CLog Klasse bezeichnet ein nacktes 'Error' den Enum-Wert und du mußt die außerhalb existierende Klasse als '::Error' (bzw. 'Namensraum::Error') ansprechen.
Evolutionär gibts nun auch noch für jeden der enum Einträge eine Funktion, nun müssen die enum Elemente ander heissen.
Häh? Was heißt das jetzt auf Deutsch? Und welche Beziehung besteht genau zwischen den enum-Elementen und diesen Funktionen?
-
CStoll schrieb:
Häh, was meinst du damit? Um das enum nutzen zu können, reicht die Definition in der Klassendeklaration völlig aus - natürlich muß dort, wo sie verwendet werden sollen, auch die komplette Klasse bekannt sein (Forward-Deklaration "class CLog;" reicht nicht aus, um den enum nutzen zu dürfen).
Ich hatte es zuerst folgendermassen:
class CLog { public: //contructor CLog(); //destructor ~CLog(); enum LogLevel; private: //setter void SetLogLevel(LogLevel logLevel); }; enum CLog::LogLevel { Off_ = 0, Fatal_ = 1, Error_ = 2, Debug_ = 3, Warn_ = 4, Info_ = 5 };Sebo
-
Na so etwas geht natürlich nicht - bevor du einen Namen (egal für was) verwenden kannst, muß er zumindest deklariert werden. Und die einzelnen enum-Werte werden erst bei der Definition (enum CLog::LogLevel{...};) deklariert.
(PS: Die Initialisierungswerte brauchst du in diesem Fall übrigens nicht ;))
-
CStoll schrieb:
Häh? Was heißt das jetzt auf Deutsch?
*lach* Was versteht man daran nicht? Es sind gleichlautende Funktionen hinzugekommen.
CStoll schrieb:
Und welche Beziehung besteht genau zwischen den enum-Elementen und diesen Funktionen?
Was tut das zur Sache?! Ansonsten schau' Dir doch mal log4net an, meine Klasse ist dem teilweise nachempfunden.
-
CStoll schrieb:
Na so etwas geht natürlich nicht - bevor du einen Namen (egal für was) verwenden kannst, muß er zumindest deklariert werden. Und die einzelnen enum-Werte werden erst bei der Definition (enum CLog::LogLevel{...};) deklariert.
(PS: Die Initialisierungswerte brauchst du in diesem Fall übrigens nicht ;))
Innerhalb der Klasse hat das sehr wohl funktioniert, nur konnte ich eben von aussen nicht mehr auf die enum-Elemente zugreifen. Das war mein Problem.
-
SeboStone schrieb:
CStoll schrieb:
Häh? Was heißt das jetzt auf Deutsch?
*lach* Was versteht man daran nicht? Es sind gleichlautende Funktionen hinzugekommen.
CStoll schrieb:
Und welche Beziehung besteht genau zwischen den enum-Elementen und diesen Funktionen?
Was tut das zur Sache?! Ansonsten schau' Dir doch mal log4net an, meine Klasse ist dem teilweise nachempfunden.
Das heißt, du hast einen Enum-Wert 'Error_' und eine Funktion (Methode?) Error() - und je nach gesetztem Log-Level wird die passende Funktion aufgerufen, verstehe ich das richtig?
SeboStone schrieb:
Innerhalb der Klasse hat das sehr wohl funktioniert, nur konnte ich eben von aussen nicht mehr auf die enum-Elemente zugreifen. Das war mein Problem.
Wo hattest du denn die enum-Definition stehen? Vermutlich nicht im Klassen-Header - und darum außerhalb der Sichtweite für das Hauptprogramm.
-
CStoll schrieb:
Das heißt, du hast einen Enum-Wert 'Error_' und eine Funktion (Methode?) Error() - und je nach gesetztem Log-Level wird die passende Funktion aufgerufen, verstehe ich das richtig?
Nicht ganz. Es gibt mehrere Funktionen, z.B. void Error(CString message); Ist der Loglevel der entsprechenden Funktion gesetzt wird die Loginformation rausgeschrieben, sonst wird sie ignoriert. Das ganze ist dann über eine Programmeinstellung steuerbar.
CStoll schrieb:
Wo hattest du denn die enum-Definition stehen? Vermutlich nicht im Klassen-Header - und darum außerhalb der Sichtweite für das Hauptprogramm.
Nein sonst wäre das ja echter Schwachsinn gewesen. Ich hatte die enum-Definition in der cpp Datei ganz oben stehen.
Sebo
-
SeboStone schrieb:
CStoll schrieb:
Wo hattest du denn die enum-Definition stehen? Vermutlich nicht im Klassen-Header - und darum außerhalb der Sichtweite für das Hauptprogramm.
Nein sonst wäre das ja echter Schwachsinn gewesen. Ich hatte die enum-Definition in der cpp Datei ganz oben stehen.
Sebo
Genau diese Aufteilung ist "echter Schwachsinn" - der Compiler bearbeitet jede Übersetzungseinheit (CPP-Datei mit allen eingebundenen include's) getrennt, und wenn er einen Namen auf diesem Weg nicht findet, meldet er einen Fehler. Das bedeutet auch, daß in der main.cpp nur die Bezeichner bekannt sind, die du im Header stehen hattest - die enum-Definition in der CPP ist nicht sichtbar.
-
CStoll schrieb:
die enum-Definition in der CPP ist nicht sichtbar.
Na genau das war mein Problem und das wurde schon einige Beiträge vorher gelöst.