Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » header wirrwarr

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
29.07.2006, 21:18 Uhr
~NO8HCE
Gast


Ich hab mehrere klassen und bin jetzt an einen punkt angekommen, bei dem ich wohl sowas wie rekursive header-includes verursache.

bsp.
Ich hab Klasse A und B .

Klasse B includiert die headerdatei von Klasse A, sowie ein paar andere.

Nun brauch ich aber ein Objekt von Klasse B in meiner Klasse A.

includier ich jetzt klasse B in Klasse A, includiere ich indirekt ja auch Klasse A in sich selbst.

Das ist mein Problem - der kompilier wirft da dann fehler aus, er würde mit der deklaration der klasseninstanz nichts anfangen können.

gibts einen kniff wie man das lösen kann?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.07.2006, 22:12 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi, ja es gibt diverse möglichkeiten:

Der Visual C++ Compiler akzeptiert z.B


C++:
#pragma once



in einem Header, welche bewirkt das die Datei nur einmal eingebunden wird. Ansonsten ist eine gängige Methode sog. "Includeguards" zu verwenden:

header.h

C++:
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

// inhalt vom header

#endif // !HEADER_H_INCLUDED



Nur muss man natürlich auf die namensgebung achten, da sich sonst gegenseitig evtl dateien aussperren.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.07.2006, 00:13 Uhr
~NO8HCE
Gast



Zitat von FloSoft:
hi, ja es gibt diverse möglichkeiten:

Der Visual C++ Compiler akzeptiert z.B


C++:
#pragma once



in einem Header, welche bewirkt das die Datei nur einmal eingebunden wird. Ansonsten ist eine gängige Methode sog. "Includeguards" zu verwenden:

header.h

C++:
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

// inhalt vom header

#endif // !HEADER_H_INCLUDED



Nur muss man natürlich auf die namensgebung achten, da sich sonst gegenseitig evtl dateien aussperren.


die includeguards benutze ich bereits - die scheinen aber nicht zu greifen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.07.2006, 10:24 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


dann scheinst du sie falsch zu verwenden oder du erzeugst wirklich irgendwelche rekursionen die der compiler nicht erkennt.


Ansonstne kann man auch forward-deklarationen verwenden:


C++:
class A
{
   B *pB;
};

...

class B
{
   A *pA;
};


Wenn man in obigem Fall bei A den header B inkludiert, und in B den Header A, erzeugt das natürlich ne "header-rekursion"

Das kann man so umgehen:


C++:
class B; // forward-deklaration von B, geht da B als pointer benutzt wird, nicht als "festes" objekt

class A
{
   B *pB;
};

...
class A; // forward-deklaration von A, geht da A als pointer benutzt wird, nicht als "festes" objekt


class B
{
   A *pA;
};



und dann die jeweiligen header in der .cpp datei inkludieren und nicht mehr im header.
Man sollte immer möglichst vermeiden das Header andere Header einbinden, da man da nicht 100%ig kontrollieren kann was wer wo wie einbindet und auch teilweise unnötige abhängigkeiten entstehen. Natürlich die Header, die gebraucht werden, muss man natürlich inkludieren, da führt ja kein Weg daran vorbei.
--
class God : public ChuckNorris { };

Dieser Post wurde am 30.07.2006 um 10:29 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.07.2006, 17:16 Uhr
xXx
Devil


Wobei eigentlich sogar die pragma once Methode, solange der Code auf jeden Fall nur mit einem VC Compiler compiliert wird, vorzuziehen ist...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: