'extern' für Strukturen

Hallo,
bei C++ kommt es ja darauf an, in welcher Reihenfolge die Headerdateien Included werden.
Wenn eine Headerdatei eher eingebunden wird, kann sie nur auf Variablen zugreifen, die in Headerdateien stehen, die später Included werden, wenn man das Schlüsselwort „extern“ verwendet. Wie macht man das aber, wenn man nicht eine Varialbe bekannt machen möchte sondern einen Strukturtyp, mit dem man eigene Variablen definieren möchte?

Vielen Dank für eine Antwort

Andreas

Hallo,

Wie macht man das aber, wenn man nicht eine
Varialbe bekannt machen möchte sondern einen Strukturtyp, mit
dem man eigene Variablen definieren möchte?

Man bindet sie zuerst ein.

Grüße,
Moritz

Hi,

Man bindet sie zuerst ein.

meinst damit die Headerdatei, in der die Struktur definiert ist?

Das geht leider nicht so leicht, da das Programm schon etwas aufwendiger ist:

Ich habe eine Headerdatei, in der wird diese Struktur definiert und diese auch verwendet wird.
In der zweiten Headerdatei wird diese Struktur auch benötigt, allerdings wird hier auch wiederum eine Klasse definiert, von der die erste Headerdatei Instanzen bilden will.

D.h egal wie rum ich die Headerdateien einbinde, entweder ist die Klasse oder die Struktur unbekannt. Wie kann ich also eine der beiden dem anderen bekannt machen?

Vielen Dank für eine Antwort, viele Grüße
Andreas

Hallo Andreas,

Das geht leider nicht so leicht, da das Programm schon etwas
aufwendiger ist:

Ich habe eine Headerdatei, in der wird diese Struktur
definiert und diese auch verwendet wird.
In der zweiten Headerdatei wird diese Struktur auch benötigt,
allerdings wird hier auch wiederum eine Klasse definiert, von
der die erste Headerdatei Instanzen bilden will.

Dann sehe ich nur zwei Möglichkeiten:

  1. Das ganze auf 3 Header-Datein aufteilen.
  2. #ifdef / #ifndef verwenden.

Meine Header-Dateien sind grundsätzlich immer folgendermassen geschrieben:
snip---------------------------------------
// HEADER.H
#ifndef HEADER_H
#define HEADER_H

// hier steht der Inhalt

#endif
snip---------------------------------------

Das verhindert jede Menge Fehlermeldungen, wenn eine Header-Datei 2 mal eingebunden wird.

Nun zu deinem Problem:
snip---------------------------------------
// HDR_1.H
#ifndef HDR_1_H
#define HDR_1_H

// Nötige Defs für Klasse 1 & 2

#ifndef HDR_2_H
#include „hdr_2.h“
#endif

// alles was auch Defs aus Klasse2 benötigt

#endif
snip---------------------------------------
// HDR_2.H
#ifndef HDR_2_H
#define HDR_2_H

// Klasse 2

#endif
snip---------------------------------------

MfG Peter(TOO)

Hallo Peter, vielen Dank für deine Antwort
Leider habe ich bisher kaum mit Präprozessoranweisungen gearbeitet, ich hab auf anderen Seiten mir die Befehle angeschaut und rumexperimentiert aber immer wieder kommen Compilerfehler.

Ich habe eine allgemeine Klasse CSpiel, die alles managed und die in Spiel.h definiert ist. In dieser Headerdateien werden folgende Headers miteingebunden:

#include
#include „Intro.h“
#include „MainMenu.h“
#include „Game.h“
#include „ProduktionsGebeude.h“
#include „Resource.h“

Jetzt gibt es den Konflikt, dass ProduktionsGebeude.h in der die gleichnamige Klasse definiert ist, der Klasse Game bekannt sein muss. Zum anderen ist in Game.h eine Struktur definiert ist, die auch die Klasse Produktionsgebeude benötigt.

Ich hab mit ifndef, define und include herumprobiert, aber irgendwie ist das nichts geworden.

Kann mir jemand vielleicht schreiben, wie ich das direkt mit diesen Klassen schreiben muss, sodass es läuft, das wäre echt nett.

Viele Grüße
Andreas

Eine Frage am Rand, weil ich noch nicht solange mit C++ arbeite:
Wenn ich eine Struktur in einer Klasse definiere, können andere Klassen sie dann auch verwenden, wenn das von den Headerdateien passen würde?

Hallo Andreas !

Strukturen die sich gegenseitig enthalten kann man mittels ‚Vorwärtsdeklaration‘ erzeugen.
Hier ein Codebeispiel aus einem meiner Programme:

// forwarddeclarations for _scripting_data, descriptions below at struct-declarations
typedef struct _scripting_data_externalinfocontainer_list
scripting_data_externalinfocontainer_list; // vorwaertsdeklaration wegen wechselseitiger definition mit struct _scripting_data, definition unten
typedef struct _additional_simplescripting_list
additional_simplescripting_list; // vorwaertsdeklaration wegen wechselseitiger definition mit struct _scripting_data, definition unten

typedef struct _scripting_data
{
cwbuffer xCurrentTargetName;
cwbuffer xTarget;
cwbuffer xNewTargetName;
int iTargetChanges;
// special fields for using scripting-lib inside multi-module-projects
scripting_data_externalinfocontainer_list *pExternalInfoContainer_List;
additional_simplescripting_list *pAdditional_SimpleCommand_List;
additional_check_simplescripting_list *pAdditional_Check_SimpleCommand_List;
additional_metascripting_list *pAdditional_MetaCommand_List;
additional_check_metascripting_list *pAdditional_Check_MetaCommand_List;
} scripting_data;

// a list for informations other modules may use at their own purposes
struct _scripting_data_externalinfocontainer_list
{
cwbuffer xExternalInfoContainer_Identifier; // identifier, moduls must set them to identify their infos
int iExternalInfo;
void *pExternalInfoContainer;
int (*pdestruct_pExternalInfoContainer)(scripting_data *p_pScriptingData, void **pExternalInfoContainer);
struct _scripting_data_externalinfocontainer_list *pNext;
};

// list with pointers to function that parses for added additional scriptings.
// this function should try to parse the scripting and call the next in the list if the scripting is not recognised
// functions that parse for additional simple scriptings
struct _additional_simplescripting_list
{
int (*pAdditional_SimpleCommand)(_scripting_data *p_pScriptingData, cwbuffer *xOutBuffer, char **pPos);
struct _additional_simplescripting_list *pNext;
};
// functions that parse for additional check simple scriptings
struct _additional_check_simplescripting_list
{
int (*pAdditional_Check_SimpleCommand)(scripting_data *p_pScriptingData, char **pPos);
struct _additional_check_simplescripting_list *pNext;
};

mfg
Christof