Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.03.2011, 10:44

Problem mit "verschachtelten" includes

Also, vor ein paar tagen hab ich beschlossen, eine Art Mue(ups - ü)lleimer-Simulator zu programmieren, anfänglich textbasiert. Mein Compiler, Dev-Cpp(verfluchtes Windoof) blieb schon beim lesen der Dateien stecken. Hier mal grob die Klassenhierarchie:

-Muelleimer:
public:
Muelleimer();
~Muelleimer();
bool objektEinwerfen(Muell);
void ausleeren();
herumWuehlen(); ( :rolleyes: )
int getFuelle();
int getMaxFuelle() -Ein Eimer muss eine Größe haben...
bool istVoll();
void refreshVoll();
protected:
int fuelle, maxFuelle;
bool voll;
vector<Muell> inhalt;
Bereich umgebung;
friend class Muell; -Um direkt auf die ->groesse vom Muell zuzugreifen...

Okay, das war der Eimer... jetzt der
-Muell:
public:
Muell(Muelltyp);
~Muell();
protected:
int groesse;
Muelltyp typ; -Jeder Muell braucht einen ->typ

dann der
-Muelltyp:
public:
Muelltyp(string);
~Muelltyp();
protected:
string name;
Okay, also das kann ich vielleicht weglassen...

und dann noch ein
-Bereich:
public:
Bereich();
~Bereich(); -Okay, bei manchen Klassen sind Kon-/Destruktoren nicht nötig.
void objekt_Hinlegen(Muell);
bool verschieben_in_Eimer(Muelleimer*);
protected:
vector<Muell> inhalt;
friend class Muelleimer; -Um den ->inhalt des Eimers in den Eimer zu schieben...

Tja, das war noch nicht das Problem... Das sind die includes der Dateien:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
//Für alle:
#include <iostream>
#include <vector>
//bereich.h:
#include "muelleimer.h"
#include "muell.h"
//muell.h
//#include "muelleimer.h" - das war mal
#include "muelltyp.h"
//muelleimer.h
#include "muell.h"
#include "bereich.h"

Okay, jetzt das Problem: bereich includet muelleimer und muelleimer includet bereich!
Der Compiler nennts verschaltelung...(Ach ja, bin auf nds-prog umgestiegen, da kann ich wenigstens die Compiler ausgaben schon vorher lesen, ist nämlich gcc)

C-/C++-Quelltext

1
#include nested to deepley

sagt er.
Nun kann ich aber schlecht einen von den includes entfernen, weil dann kennt entweder der Eimer den Bereich nich oder Umgekehrt... Und ich glaube nicht, dass es was ändern würde, die Klasse Muelltyp zu entfernen.
Was kann ich sonst tun?
bitte gnädigst um Hilfe :?: :?: :?: :?: :?: :?: :?: :?:
:rolleyes: Danke schon mal...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

11.03.2011, 10:51

Schau dir mal das PIMPL Idiom an. Das sollte in so einem Fall abhelfen.
@D13_Dreinig

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

11.03.2011, 10:57

(verfluchtes Windoof)

Niemand zwingt Dich Windows zu benutzen. Wenn es Dir nicht gefällt, nimm ein anderes Betriebssystem.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

11.03.2011, 11:16

Mein Compiler, Dev-Cpp(verfluchtes Windoof) blieb schon beim lesen der Dateien stecken.

Wenn du Dev-Cpp verwendest (das ist übrigens nur eine IDE und kein Compiler, lustigerweise verwendet Dev-Cpp GCC als Compiler ;)) bist du selber schuld. Das Ding ist schon seit Jahren total veraltet und verbuggt. Windows kann da nix dafür. Ich würd dir jedenfalls sehr empfehlen was ordentliches zu benutzen.

Okay, jetzt das Problem: bereich includet muelleimer und muelleimer includet bereich!

Ja, das ist ein Problem, das kann so natürlich nicht funktionieren, mit dem Compiler oder Betriebssystem hat das erst recht nix zu tun. Die Lösung für dein Problem heißt Forward Declaration. Diese Frage wird hier im Forum durchschnittlich einmal pro Woche gestellt, ich schlag vor du benutzt einfach kurz die Suchfunktion, dann solltest du sehr schnell fündig werden ;)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (11.03.2011, 11:23)


5

11.03.2011, 13:24

Also, das schaut jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//muelleimer.h
namespace MUELL
{
    class Bereich;
    class Muelleimer {
        //...
    };
}

Jetzt sagt der Compiler:

Quellcode

1
muelleimer.h:28: error: field umgebung has incomplete type.

Überrascht mich nicht.
ach ja, bereich.h sieht natürlich genauso aus, nur umgekehrt.

C-/C++-Quelltext

1
2
3
4
//Muelleimer.cpp
#include "muelleimer.h"
#include "bereich.h"
//Das gleiche in Bereich.cpp...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

11.03.2011, 13:27

Verwendest/Erstellst du in muelleimer.h irgendwo ein Objekt der Klasse umgebung? Dafür ist eine forward declaration natürlich nicht ausreichend.

7

11.03.2011, 13:30


Verwendest/Erstellst du in muelleimer.h irgendwo ein Objekt der Klasse umgebung? Dafür ist eine forward declaration natürlich nicht ausreichend.

Tja, genauso isses... Ein Muelleimer braucht eine Umgebung, in die man das legt, was nicht in den Eimer passt...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

11.03.2011, 13:37

Dann musst du bereich.h auch in mülleimer.h inkludieren. Aber Braucht Umgebung auch einen Mülleimer?

9

11.03.2011, 14:02


Dann musst du bereich.h auch in mülleimer.h inkludieren. Aber Braucht Umgebung auch einen Mülleimer?

tja, für die Funktion "verschieben_in_Muelleimer". Irgendwie muss man den Bereich auch leeren können.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

11.03.2011, 14:18

im header deklarieren und nur zeiger oder referenzen deklarieren. in der cpp kannst du dann ohne probleme includieren und benutzen. du musst das objekt halt dynamisch erzeugen(und wieder freigeben^^).
includes in header sollte man sowieso vermeiden(geht natürlich nicht immer z.b. bei vererbung).
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige