C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problem mit Enumerations

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Andreas Maly
Guest





PostPosted: Sat Jun 12, 2004 6:10 pm    Post subject: Problem mit Enumerations Reply with quote



Hallo beisammen,

ich bin beim Programmieren auf ein Problem gestoßen, für das ich bisher noch
keine Lösung finden konnte. Vielleicht auch, weil ich nicht weiß, wie ich
nach einer Lösung suchen sollte.

Das Problem ist das Folgende:

Ich habe eine Klasse Testklasse. In der Headerdatei definiere ich eine
Enumeration, z.B.
enum Enumeration {EINTRAG1, EINTRAG2}
Nun kann ich ja "Enumeration" verwenden wie einen anderen Typbezeichner
auch. Ich kann also beispielsweise damit Vektoren typisieren.

Nun habe ich noch eine andere Klasse, in welcher ich diese in Testklasse
definierte Enumeration auch verwenden möchte. Allerding klappt das nicht. In
der Klasse, in welcher die Enumeration definiert ist, klappt's mit der
selben Syntax tadellos. Ich habe die Enumeration auch public definiert, so
dass ich eigentlich darauf zugreifen können müsste.

Vielleicht könnt ihr mir ja weiterhelfen und sagen, was ich falsch mache.
Schönen Dank schon mal

Andreas



Beispielcode folgt:

Testklasse.hpp
----------------------

#ifndef TESTKLASSE_HPP
#define TESTKLASSE_HPP
#include "AndereKlasse.hpp"
#include <vector>
using std::vector;
namespace myNamespace {
class Testklasse {
public:
typename enum Enumeration{EINTRAG1, EINTRAG2};
Testklasse(vector<Enumeration>);
};
}
#endif

Testklasse.cpp
----------------------

#include <vector>
#include "Testklasse.hpp"
#include "AndereKlasse.hpp"
#include <vector>
using std::vector;
namespace myNamespace {
Testklasse::Testklasse(vector<Enumeration> parameter) {
}
}

AndereKlasse.hpp
---------------------------

#ifndef ANDEREKLASSE_HPP
#define ANDEREKLASSE_HPP
#include "Testklasse.hpp"
#include <vector>
using std::vector;
namespace myNamespace {
class AndereKlasse {
public:
virtual int create(vector<Testklasse::Enumeration>) = 0;
};
}
#endif

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Steffen Rauh
Guest





PostPosted: Sat Jun 12, 2004 6:58 pm    Post subject: Re: Problem mit Enumerations Reply with quote



Quote:
Vielleicht könnt ihr mir ja weiterhelfen und sagen, was ich falsch mache.
Schönen Dank schon mal

Praktisch wäre noch eine konkrete Fehlermeldung mit einer konkreten
Quelltextstelle gewesen, wie das "nicht klappen" sich genau äußert. Aber
weil die fehlt, einfach mal einen Schuß ins Blaue:

Das Ganze schlägt fehl, weil beim Übersetzen von Testklasse.cpp der Typ
Testklasse::Enumeration verwendet wird, bevor er deklariert ist. Nimm dir
mal deinen Quelltext vor und überlege dir (notfalls mit copy und paste),
wann welche Header-Datei vom Präprozessor eingebunden wird und löse den
Konflikt entsprechend auf (warum wird die Headerdatei der anderen Klasse in
die Headerdatei der Testklasse eingebunden?).

MfG,
Steffen Rauh

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Sat Jun 12, 2004 10:02 pm    Post subject: Re: Problem mit Enumerations Reply with quote



"Andreas Maly" <RainbirdTheElder (AT) gmx (DOT) de> schrieb:

Quote:
Beispielcode folgt:

Eigentlich sollte Dir ein brauchbarer Compiler bei diesen Fehlern
schon passende Meldungen geben:

Quote:

Testklasse.hpp
----------------------

#ifndef TESTKLASSE_HPP
#define TESTKLASSE_HPP
#include "AndereKlasse.hpp"
#include <vector
using std::vector;
namespace myNamespace {

Ist ein bißchen eigenartig. Das »using« würde (wenn überhaupt in
einem Header) sinnvollerweise innerhalb »myNamespace« erfolgen.

Quote:
class Testklasse {
public:
typename enum Enumeration{EINTRAG1, EINTRAG2};

»typename« ist an dieser Stelle falsch.


Quote:
AndereKlasse.hpp
---------------------------

#ifndef ANDEREKLASSE_HPP
#define ANDEREKLASSE_HPP
#include "Testklasse.hpp"

Zyklisches Include. Mehr steht in der FAQ.

Quote:
#include using std::vector;
namespace myNamespace {
class AndereKlasse {
public:
virtual int create(vector

Würde ansonsten funktionieren. Nimm den Typen halt aus der Klasse
raus. Scheinbar gehört das sowieso anders. Vermeide (für den Anfang)
jede Schachtelung von Klassen. Vielleicht auch Namensräume, solange
Du nicht genau weißt, wozu die gut sind. Und »using« ...

MfG

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Andreas Maly
Guest





PostPosted: Sat Jun 12, 2004 10:02 pm    Post subject: Re: Problem mit Enumerations Reply with quote

Quote:
Praktisch wäre noch eine konkrete Fehlermeldung mit einer konkreten
Quelltextstelle gewesen, wie das "nicht klappen" sich genau äußert.

Ich bekomme beim Kompilieren die Fehlermeldung, dass das "Enumeration" ein
nichtdeklarierter Bezeichner ist. Angezeigt wird der Fehler an der Stelle in
AndereKlasse, an welcher das Enumeration verwendet werden soll.

Quote:
Das Ganze schlägt fehl, weil beim Übersetzen von Testklasse.cpp der Typ
Testklasse::Enumeration verwendet wird, bevor er deklariert ist. Nimm dir
mal deinen Quelltext vor und überlege dir (notfalls mit copy und paste),
wann welche Header-Datei vom Präprozessor eingebunden wird und löse den
Konflikt entsprechend auf (warum wird die Headerdatei der anderen Klasse
in
die Headerdatei der Testklasse eingebunden?).

Also das Einbinden der AnderenKlasse-Headerdatei in der Testklasse brauche
ich, genauso wie das Einbinden der Testklasse-Headerdatei in der
AnderenKlasse. Das Beispiel ist ja aus einem konkreten Programmkontext
extrahiert, wo ich das benötige.

Die Erklärung dürfte aber, trotz dem Schuss ins Blaue, richtig gewesen sein
Smile
Ich bin es von Java her nicht gewohnt, dass so etwas auftreten kann. Dort
muss man nicht aufpassen, wann welche Klasse wo eingebunden wird. Konflikte
dieser Art treten nicht auf.
Ich habe mir die Klassen nochmal angeschaut, und überlegt, wie ich diesen
Konflikt "auflösen" kann, wie du vorgeschlagen hattest. Mir fällt aber beim
besten Willen nicht ein, wie ich das machen soll. Die beiden Header binden
sich ja quasi kreuzweise ein.

Das einzige, was mir zur Lösung eingefallen ist, ist das Auslagern der
Enumeration in eine separate Headerdatei. Die kann dann von Testklasse und
AndereKlasse eingebunden werden. Das funktioniert auch. Als Notlösung werde
ich wohl darauf zurückgreifen müssen. Aber ganz zufrieden bin ich damit
nicht, da die Enumeration eigentlich semantisch in die Testklasse gehört.

Gibt's da nicht eine andere Möglichkeit, diesen Konflikt zu lösen? Ich bin
sowohl mit C++, als auch mit meiner IDE (Visual Studio .NET) momentan noch
viel zu wenig vertraut, als dass ich überblicken könnte, ob sich mit
irgendwelchen Einstellungen an Präprozessoroptionen oder sonstigem hier
etwas machen ließe.

Andreas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Rauh
Guest





PostPosted: Sun Jun 13, 2004 5:58 pm    Post subject: Re: Problem mit Enumerations Reply with quote

Quote:
Gibt's da nicht eine andere Möglichkeit, diesen Konflikt zu lösen?

So allgemein lässt sich da jetzt schlecht was sagen. Grundsätzlich wäre das
Auslagern in eine separate Header-Datei eine Lösung. Wenn das aber
semantisch keinen Sinn macht, wäre noch zu prüfen, ob die Header-Dateien
wirklich in beiden Headern eingebunden werden müssen, oder ob es z.B.
möglich wäre, Includes in die Cpp-Datei zu verschieben. Man könnte z.B. auch
auf Header-Ebene eine Abstraktion in Form einer abstrakten Basisklasse
einführen und diese dann im Source File erst konkretisieren. Kommt aber
immer auf das entsprechende Projekt und die Problemstellung an. Vielleicht
kannst ja eine einfache Beschreibung des Projektes liefern (aber bitte nicht
allen Source posten, das liest sonst kaum jemand), dann könnte man über
konkretere Lösungswege diskutieren.

MfG,
Steffen Rauh

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Andreas Maly
Guest





PostPosted: Mon Jun 14, 2004 2:57 pm    Post subject: Re: Problem mit Enumerations Reply with quote

Quote:
So allgemein lässt sich da jetzt schlecht was sagen. Grundsätzlich wäre
das
Auslagern in eine separate Header-Datei eine Lösung. Wenn das aber
semantisch keinen Sinn macht, wäre noch zu prüfen, ob die Header-Dateien
wirklich in beiden Headern eingebunden werden müssen, oder ob es z.B.
möglich wäre, Includes in die Cpp-Datei zu verschieben. Man könnte z.B.
auch
auf Header-Ebene eine Abstraktion in Form einer abstrakten Basisklasse
einführen und diese dann im Source File erst konkretisieren. Kommt aber
immer auf das entsprechende Projekt und die Problemstellung an. Vielleicht
kannst ja eine einfache Beschreibung des Projektes liefern (aber bitte
nicht
allen Source posten, das liest sonst kaum jemand), dann könnte man über
konkretere Lösungswege diskutieren.

Ich habe mich jetzt für die Realisierung per separater Headerdatei
entschieden.
Die anderen von dir vorgeschlagenen Möglichkeiten würden mir leider nicht
weiterhelfen.

Aber auf jeden Fall vielen Dank für die ganzen Antworten. Ohne die wäre ich
wahrscheinlich nicht drauf gekommen, dass die Ursache des Problems die
zyklischen Include-Anweisungen sein könnten. Auf jeden Fall schon wieder was
dazugelernt :)

Andy

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.