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. |