Gegenseitiger Aufruf von Funktion in zwei Klassen
-
Hi,
ich stehe wieder einmal vor einem Problem.
Zwei Klassen müssen auf Funktionen der jeweils anderen Klasse zugreifen.
Jede Klassen hat einen Pointer auf die andere Klasse von einer dritten Klasse bekommen.Sieht also so aus:
Class a:
- Pointer class b1.
- Pointer class b2.Class b1:
- Pointer class b2. (von a bekommen)
- Funktion x1. //ruft y2 auf
- Funktion x2.Class b2:
- Pointer class b1. (von a bekommen)
- Funktion y1. //ruft x2 auf
- Funktion y2.Wie es nunmal ist haben die Klassen b1 und b2 eigene header.
Nun ist die Frage, wie ich die header von b1 und b2 gegeneinander verlinke. An sich ist das ja nicht möglich, da man sonst einen unendlichen rekursiven linking-Prozess hat.
Gibt es dafür eine Lösung?
Eine Helferklasse c für die Kommunikation kann ich ja nicht einsetzen. Die müsste ja wieder b1 und b2 inkludieren und b1 und b2 eben wieder c
Vererbung würde ich äußerst ungern einsetzen, da b1 und b2 komplett unterschiedliche Aufgaben und Inhalte haben.
Und ja, ich weiß dass das ein ständiges Thema ist, bin aber noch nicht auf eine anständige Lösung gestoßen.Viele Grüße
Cherup
-
Dein Stichwort für Google heißt "Forward Declaration"
-
Danke, das hilft mir weiter

-
Also irgendwie bin ich wohl zu blöd, um das zu nutzen.
Ich hab jetzt in den Klassen b1 und b2 vor der eigentlichen Klasse "class b2;" in b1 und "class b1;" in b2 eingefügt.
Jetzt sagt mir der Compiler: "Fehler: Vorwärtsdeklaration von struct b1". Zu b2 ist er wohl gar nicht gekommen...Und ist es richtig, das er eine Klasse als struct sieht?
Was mache ich falsch? (Blöde Frage aber nunja...)
Viele Grüße
Cherup
-
Cherup schrieb:
Was mache ich falsch? (Blöde Frage aber nunja...)
Du zeigst nur Prosa statt Code.
-
Da hast du recht, wollte es vereinfachen. War wohl in Fall übertrieben.
Hier also der Code dazu:a.h:
#include "b1.h" #include "b2.h" class a{ private: b1* myB1; b2* myB2; public: a() };a.cpp:
#include "a.h" a::a(){ myB1 = new b1; myB2 = new b2; myB1->setB2Pointer(myB2); myB2->setB1Pointer(myB1); }b1.h:
class b2; class b1{ private: b2* myB2Pointer; public: b1(); void setB2Pointer(b2* p); void funcX1(); int funcX2(); };b1.cpp:
#include "b1.h" b1::b1() {} void b1::setB2Pointer(b2* p){ myB2Pointer = p; } void b1::funcX1(){ int i = myB2Pointer->funcY2(); } int b1::funcX2(){ return 1; }b2.h:
class b1; class b2{ private: b1* myB1Pointer; public: b2(); void setB2Pointer(b1* p); void funcY1(); int funcY2(); };b2.cpp:
#include "b2.h" b2::b2() {} void b1::setB2Pointer(b1* p){ myB1Pointer = p; } void b2::funcY1(){ int i = myB1Pointer->funcX2(); } int b2::funcY2(){ return 2; }Hab das jetzt mal so runtergeschrieben, um bei der Namensgebung zu bleiben, stimmt aber an sich mit den Klassen bei mir überein. Die sind einfach sehr umfangreich und würden wohl den Rahmen (und vor allem die Übersichtlichkeit) sprengen

Eventuelle Schreibfehler dabei bitte ich zu entschuldigen.
Viele Grüße
Cherup
-
Hast du denn auch ausprobiert, ob das "so runtergeschriebene" den Fehler reproduziert?
In den cpp müsste jedenfalls b1 und b2 eingebunden werden.
-
Ne, hat er natürlich nicht. Semikolons fehlen, Flüchtigkeitsfehler wie '1' statt '2' ... boah
a.h#ifndef A_H_INCLUDED #define A_H_INCLUDED class b1; class b2; class a { private: b1* myB1; b2* myB2; public: a(); }; #endif /* A_H_INCLUDED */a.cpp#include "a.h" #include "b1.h" #include "b2.h" a::a() { myB1 = new b1; myB2 = new b2; myB1->setB2Pointer(myB2); myB2->setB1Pointer(myB1); }b1.h#ifndef B1_H_INCLUDED #define B1_H_INCLUDED class b2; class b1 { private: b2* myB2Pointer; public: b1(); void setB2Pointer(b2* p); void funcX1(); int funcX2(); }; #endif /* B1_H_INCLUDED */b1.cpp#include "b1.h" #include "b2.h" b1::b1() {} void b1::setB2Pointer(b2* p) { myB2Pointer = p; } void b1::funcX1() { int i = myB2Pointer->funcY2(); } int b1::funcX2() { return 1; }b2.h#ifndef B2_H_INCLUDED #define B2_H_INCLUDED class b1; class b2 { private: b1* myB1Pointer; public: b2(); void setB1Pointer(b1* p); void funcY1(); int funcY2(); }; #endif /* B2_H_INCLUDED */b2.cpp#include "b2.h" #include "b1.h" b2::b2() {} void b2::setB1Pointer(b1* p) { myB1Pointer = p; } void b2::funcY1() { int i = myB1Pointer->funcX2(); } int b2::funcY2() { return 2; }
-
Ok, danke für eure Hilfe.
Wie gesagt, es war ein runtergeschriebenes Beispiel, daher das fehlende Semikolon und der eine Dreher mit 1 und 2.
In den wesentlichen Punkten war es aber korrekt, ich hatte die Header nicht in den CPPs eingebunden. Das hat dann die Lösung gebracht.
Nun scheint es zu laufen
Viele Grüße
Cherup