Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » enum in Klasse

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.06.2010, 21:57 Uhr
Lensflare



Hallo

Ich habe hier ein kleines Beispiel erstellt, das ein Problem zeigt, auf das ich öfters stoße:

Zwei Klassen A und B besitzen Zeiger aufeinander.
Klasse A definiert ein enum, das auch Klasse B verwendet.

main.cpp

C++:
#include <iostream>

#include "A.h"
#include "B.h"

using namespace std;

int main() {
    cout << "enum test" << endl;

    A* a = new A;
    B* b = new B;
    
    a->b = b;
    b->a = a;

    b->DoSomething(ITEM_CHAIR);

    return 0;
}



A.h

C++:
#ifndef _A_H
#define _A_H

#include "B.h"

class B;

class A {
public:
    enum ITEM {
        ITEM_CHAIR,
        ITEM_TABLE,
        ITEM_CARPET
    };

    B* b;
};

#endif    /* _A_H */



B.h

C++:
#ifndef _B_H
#define _B_H

#include "A.h"

class A;

class B {
public:
    A* a;

    void DoSomething(A::ITEM item);
};

#endif    /* _B_H */



Dieser Code ist nicht kompilierbar:

Code:
In file included from A.h:4,
B.h:12: error: `struct A::ITEM' has not been declared
B.h:12: error: ISO C++ forbids declaration of `item' with no type



Ich erkläre es mir so:
Anscheinend gibt es da ein ähnliches Problem wie bei sich gegenseitig kennenden Klassen.
Bei den Klassen löse ich es indem ich sie vorwärts deklariere.
Aber bei den enums habe ich sowas wie vorwärts deklarieren nicht hinbekommen.

Das enum aus der Klasse rauszunehmen (aber in der selben Datei zu lassen) hat auch nichts gebracht.
Aber das enum in eine eigene Datei zu legen funktioniert wiederum.
Allerdings hätte ich das enum aus Abstraktionsgründen gerne innerhalb der Klasse.

Es funktioniert auch, wenn ich innerhalb der B.cpp Datei auf das enum zugreife.
Aber ich brauche es in der B.h Datei für die signatur der öffentlichen Funktion.

Kennt ihr eine Lösung, bei der das enum in der Klasse bleiben kann und in der Headerdatei verwendet werden kann?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 05.06.2010 um 22:00 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.06.2010, 09:04 Uhr
Tommix



'Morgen

C++:
int main() {
    // ...
    b->DoSomething(A::ITEM_CHAIR);



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.06.2010, 13:31 Uhr
0xdeadbeef
Gott
(Operator)


Es scheint in diesem Fall so zu sein, dass Klasse A Klasse B nicht in allen Einzelheiten zu kennen braucht, also würde ich das

C++:
#include "B.h"


da entfernen. Wenn du Details der Klasse B in der Deklaration der Klasse A kennen musst, sehe ich da keine saubere Möglichkeit - du könntest höchstens int entgegennehmen und intern casten, aber da würde ich doch eher die enum in einen eigenen Header auslagern.

Eigentlich würde ich das wahrscheinlich sowieso.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.06.2010, 16:44 Uhr
Lensflare



ok, jetzt brauche ich mir wenigstens nicht mehr den kopf darüber zerbrechen.
danke
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: