Seite 1 von 1

include Problem

Verfasst: Di Mär 23, 2010 7:23 pm
von hackmack
Hi,

ich habe grad ein Problem bei nem (mini-)Projekt von mir. Ich habe 2 Klassen, wobei die erste (class1) ein Objekt der zweiten (class2) als Eigenschaft hat. Die zweite (class2) allerdings hat einen Zeiger auf die erste (class1) als Attribut.

class1.h

Code: Alles auswählen

#ifndef CLASS_1
#define CLASS_1

#include "class2.h"

class class1
{
    public:
        class2 temp;
};
#endif
class2.h

Code: Alles auswählen

#ifndef CLASS_2
#define CLASS_2

#include "class1.h"

class class2
{
    public:
        class1 *class1_ptr;
};
#endif
Konkret habe ich jetzt das Problem, dass mir der Compiler diesen Fehler auswirft:
error: ISO C++ forbids declaration of `class1' with no type
Warum der Fehler kommt ist mit klar, nur wie kann ich ihn verhindern?

Mfg.
hackmack

Re: include Problem

Verfasst: Di Mär 23, 2010 7:37 pm
von AnGaiNoR
Da du in der Klasse class2 nur einen Zeiger brauchst und nicht die Klasse selber kannst du dir den Include sparen und eine sogenannte "forward declaration" nutzen.

class2.h:

Code: Alles auswählen

#ifndef CLASS_2
#define CLASS_2

// forward declaration
class class1;

class class2
{
    public:
        class1 *class1_ptr;
};
#endif
Möchtest du später in class2.cpp auf die Klasse class1 zugreifen musst du class1.h aber trotzdem includieren, aber eben erst in class2.cpp.

Re: include Problem

Verfasst: Di Mär 23, 2010 7:46 pm
von hackmack
Danke,
super es läuft :P

Wird diese Methode bei größeren Projekten etwas unübersichtlich, oder lagert man dann alle "forward declarations" in eine extra Datei aus?

Re: include Problem

Verfasst: Mi Mär 24, 2010 6:14 pm
von AnGaiNoR
hackmack hat geschrieben:Danke,
super es läuft :P
Dazu gibt es ja das Forum ^^

hackmack hat geschrieben: Wird diese Methode bei größeren Projekten etwas unübersichtlich, oder lagert man dann alle "forward declarations" in eine extra Datei aus?
Eigentlich wird da nichts unübersichtlich. Ob du nun den Header einbindest oder die forward declaration schreibst macht ja rein übersichtstechnisch keinen wahnsinnigen Unterschied. Ich persönliche binde den Header nur dann ein, wenn ich an betreffender Stelle auch wirklich brauche, also wenn ich auf Methoden zugreife oder "richtige" Objekte brauche (keine Zeiger oder Referenzen). Auch bei großen Projekten kann man das auf diese Weise handhaben. Einen Extraheader würde ich nicht unbedingt anlegen.

Re: include Problem

Verfasst: Mi Mär 24, 2010 6:48 pm
von Xin
hackmack hat geschrieben:Wird diese Methode bei größeren Projekten etwas unübersichtlich, oder lagert man dann alle "forward declarations" in eine extra Datei aus?
Solange Du keine Namensräume nutzt, kannst Du auch:

Code: Alles auswählen

class class2
{
  public:
    class class1 * pointer;
};
schreiben. Bei Namensräumen musst Du zumindest zuvor den Namensraum bekannt machen.