PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Header Problem



Odzilla
12-11-2005, 22:22
Und gleich das nächste Problem :)

Habe zwei verschiedene Klassen in zwei verschiedenen Header-Dateien definiert.
list.h:


#include "data.h" // <- führt an der Stelle zu 'cNode undeclared'
class cNode
{
public:
[...]
protected:
[...]
cMyData * myData;
};
data.h:


#include "list.h" // <- führt zu 'cMyData undeclared'
class cMyData
{
public:
[...]
protected:
cNode * myNode;
};

Das Problem ist, dass sich die Klassen gegenseitig benötigen und ich somit die Header untereinander inkludieren muss. Dabei kommt es zu dem Fehler, dass immer entweder cNode oder cMyData nicht definiert sind, je nachdem welche Header-Datei zuerst verarbeitet wird.

Ich wollte nicht beide Klassen in eine Header schmeissen, da dies sehr unübersichtlich ist. (Sie waren in der letzten Version zusammen, in dieser will ich sie trennen)
Leider brauch ich in beiden Dateien auch Zugriff auf die Methoden der Klassen, deshalb bringt es nichts, die Klassen per 'class cNode;' bzw 'class cMyData;' in die jeweils anderen Header-Datei zu integrieren.

Wie löst ihr sowas? Schmeisst ihr die Klassen zusammen, oder gibts noch ne andere Methode?

Joghurt
13-11-2005, 02:24
Es reicht, dem Compiler mitzuteilen, dass cMyData eine Klasse ist:
class cMyData;
class cMyNode {...};Dasselbe für cMyData

Odzilla
13-11-2005, 11:23
Ja, schön wärs ;)

Brauch ja in der Klasse cNode zb auch Zugriff auf Methoden der Klasse cMyData ... und da haperts dann.

so zb:

bool cInternalNode::Run( cMyData * data )
{
if(!myData->Run(data)) return myNext->Run(data);
return false;
}

Wobei cInternalNode von cNode abgeleitet und myData vom Typ cMyData ist.

anda_skoa
13-11-2005, 13:51
Das ist im cpp File, dor brauchst du dann schon das include

Im Header reicht die Forwarddeclaration, da muß der Compiler nur wissen, wie der Typ heißt.

Also


class cMyData; // Typ bekannt machen
class cNode
{
public:
[...]
protected:
[...]
cMyData * myData;
};




#include "data.h"
bool cInternalNode::Run( cMyData * data )
{
if(!myData->Run(data)) return myNext->Run(data);
return false;
}


Ciao,
_

Odzilla
13-11-2005, 14:02
Argh jetz seh ich den Fehler :)


class cMyData
{
public:
[...]
void Destroy() { myNode->Destroy(); } // <- aua
protected:
cNode * myNode;
};

Ich setz das mal in die .cc Datei =)

Danke für die Hilfe :)