include Problem

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

include Problem

Beitrag von hackmack » Di Mär 23, 2010 7:23 pm

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
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: include Problem

Beitrag von AnGaiNoR » Di Mär 23, 2010 7:37 pm

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.
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: include Problem

Beitrag von hackmack » Di Mär 23, 2010 7:46 pm

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?
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: include Problem

Beitrag von AnGaiNoR » Mi Mär 24, 2010 6:14 pm

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.
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: include Problem

Beitrag von Xin » Mi Mär 24, 2010 6:48 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten