2 Klassen gegenseitig Zeiger zuweisen

AckiB

Mitglied
Hi,
ich habe 2 Klassen, denen ich jeweils einen Zeiger auf die jeweils andere Klasse übergeben möchte.
Dazu müsste ich in jeder Klasse die jeweils andere Headerdatei includen...
Das führt aber zu Kompilerfehlern (logisch) !

Gibt es eine Möglichkeit, wie ich Das hinbekomme ?

Danke, Acki
 
ocb hat gesagt.:
Beide Klassen in einen Header und Forward-Deklaration?
Guter Ansatz. Ist aber nicht nötig, sie in einen einzigen Header zu packen.

Code:
// header A, wird inkludiert von B.cpp:
class B; // Vorwärtsdeklaration

class A
{
  B* m_MeinB;
  //...
};

// header B, wird inkludiert von A.cpp:
class A; // Vorwärtsdeklaration

class B
{
  A* m_MeinA;
  //...
};
 
Zuletzt bearbeitet:
Hi!
Kachelator hat gesagt.:
Guter Ansatz. Ist aber nicht nötig, sie in einen einzigen Header zu packen.
Der Satz ist in meinen Augen richtig, aber... Mal ehrlich, wie soll der aus dem Pseudocode ersichtlich sein, was man machen muss?

Wie wärs mit den Preprozessoranweisungen:
Code:
#ifndef CLASSA_H
#define CLASSA_H
#include "ClassA.h"

CClassA
{
...
};

#endif
gleiches natürlich umgekehrt auch mit Klasse B.

Gruss Michael
 
Code Fatal, dein Code ist ja toll (und die multi inclusion lock ist auch toll) aber die Lösung hat ja Kachelator beschrieben und du hast mit deinem COde schnipsel nicht das Problem gelöst ;-)
 
basd hat gesagt.:
Code Fatal, dein Code ist ja toll (und die multi inclusion lock ist auch toll) aber die Lösung hat ja Kachelator beschrieben und du hast mit deinem COde schnipsel nicht das Problem gelöst ;-)
Ah, danke. Das ist ein sehr willkommener Kommentar.

Übrigens:
@CodeFatal: Über den "Pseudocode" komme ich nicht hinweg. Wie meinst du das? :rolleyes:

Ich würde übrigens die Header der jeweiligen Klasse nicht im jeweiligen Header der anderen Klasse inkludieren. Sauberer und vor allem auch günstiger für die Kompilierzeit ist es immer, die #Includes nach Möglichkeit in die .cpp zu setzen und innerhalb der Header soweit es geht nur mit kurzen Deklarationen á la "class B;" arbeiten.
 
basd hat gesagt.:
du hast mit deinem COde schnipsel nicht das Problem gelöst ;-)
Sorry aber die Frage war doch ob und wenn ja, wie man zwei Klassen gegenseitig includiert. Das einfach "include" nicht reicht hat AckiB selbst gemerkt und Kachelator hat in meinen Augen einen Fehler gemacht. Wenn man den anderen Header nur in der Cpp includiert, ist ClassA in HeaderB leider immer noch nicht bekannt. Da aber ein Pointer auf diese Klasse im HEADER gewünscht ist, muss die Header-Datei gegen doppelt Includes geschützt werden. Dann kennen die Header sich zwar gegenseitig, aber beim Precompilen und Compilieren, wird der ganze Aufwand nur einmal betrieben und schau da das Problem ist gelöst obwohl beide Klassen jeweils eine eigene Header- und cpp-Datei haben.

Gruß Michael
 
Kachelator hat gesagt.:
Ah, danke. Das ist ein sehr willkommener Kommentar.

Übrigens:
@CodeFatal: Über den "Pseudocode" komme ich nicht hinweg. Wie meinst du das? :rolleyes:

Ich würde übrigens die Header der jeweiligen Klasse nicht im jeweiligen Header der anderen Klasse inkludieren. Sauberer und vor allem auch günstiger für die Kompilierzeit ist es immer, die #Includes nach Möglichkeit in die .cpp zu setzen und innerhalb der Header soweit es geht nur mit kurzen Deklarationen á la "class B;" arbeiten.

Hallo Ich schon wieder!
Mir wurde C/C++ zwar nicht in die Wiege gelegt aber bin ich der Einzige, der neben Micro... Precompile-Anweisungen verwendet?

Zum Punkt Header nicht im anderen Header zu includieren - der Sauberkeit halber - stimm ich dir durchaus zu. Mir ist nur keine andere Möglichkeit bekannt, als den anderen Header im Header zu includieren, wenn man hier Dinge aus anderen Dateien brauch. Sollte es was besseres geben bin ich für alle Infos offen und bereit zu lernen.
Gruss Michael
 
Das Problem, um das es in diesem Thread geht, hat aber absolut nichts mit dem Ausschliessen mehrfacher Includes zu tun.

Wenn man den anderen Header nur in der Cpp includiert, ist ClassA in HeaderB leider immer noch nicht bekannt. Da aber ein Pointer auf diese Klasse im HEADER gewünscht ist, muss die Header-Datei gegen doppelt Includes geschützt werden. Dann kennen die Header sich zwar gegenseitig, aber beim Precompilen und Compilieren, wird der ganze Aufwand nur einmal betrieben und schau da das Problem ist gelöst obwohl beide Klassen jeweils eine eigene Header- und cpp-Datei haben.
Falsch. Für einen Pointer wird keine komplette Headerdatei gebraucht. Wenn das so wäre, würde das Ganze hinten und vorne nicht gehen. Die Header können alle ausschliesslich in der Cpp inkludiert werden. Das ist vollkommen in Ordnung und meiner Meinung nach hier vorzuziehen.

Wie wichtig es ist, Header vor doppelter Inkludierung zu schützen, ist mir durchaus klar. Ich habe es bewusst nicht eingefügt, weil ich die Guards eigentlich für eine Selbstverständlichkeit halte und das Beispiel nicht mit unwesentlichem Kram verschmutzen wollte, da -- wie gesagt -- doppelte Inkludierung hier keine Rolle spielt.
 
Hallöchen erstmal...

äh, ich hoffe es ist erlaubt eine kleine Zwischenfrage zu stellen - ich bin absoluter C++ Anfänger und versuche das ganz hier gerade zu verstehen...

wenn ich:
Code:
class A
{
*B m_MeinB;
}

ist dann m_MeinB so ne Phydomethode wie es m_MeinB() wäre? Das würde dann wohl heißen, ich kann, für Methoden ohne Argumente ,bei der dekleration die Klammern sparen.

Wenn das so ist, super - dann hätte ich alles verstanden. Wenn nicht, könnt mich dann jemand kurz aufklären...

Noch mal sorry wegen der "dummen" zwischenfrage...
 
Zuletzt bearbeitet:
Zurück