Bitte durch treffenden Titel ersetzen, kanns nur beschreiben
-
Also ich steh grad auf dem Schlauch, folgende Sache
Ich habe eine Klasse A, welche ein Objekt der Klasse B enthält
class A { public: B b; void init(); void doSomething(); }; class B { werkelVorDichHer(); }In der init-Funktion wird b.werkelVorDichHer() aufgerufen.
Diese Funktion wartet dann auf ein SIgnal worauf
a.doSomething()
aufgerufen werden soll.Nur hab ich keine Ahnung wie ein Element in einer Klasse eine Funktion der überliegenden aufrufen könnte.
Vielleicht übersehe ich einen anderen Weg aber vlt gibts ja hier eine Lösung
-
class B; class A { public: B b; void init() // implementierung in die .cpp, wo dann das andere file included wird { b.werkelVorDichHer ( *this ); } void doSomething(); }; class A; class B { werkelVorDichHer(A& caller); }Da brauchst du wahrscheinlich Vorwärtsdeklarationen der Klassen.
btw:
Eine solche öffentliche Init Funktion ist eine schlechte Idee. Benutz den Konstruktor, um Initialisierungsdinge zu machen.
-
Du musst die Sache in Header- und Source-Files aufteilen:
// B.hpp #ifndef H_B_INCLUDE_GUARD_2342324342 #define H_B_INCLUDE_GUARD_2342324342 class B { public: void doB(); } #endif // H_B_INCLUDE_GUARD_2342324342 // B.cpp #include "B.hpp" void B::doB() { // ... } // A.hpp #ifndef H_A_INCLUDE_GUARD_70970980877 #define H_A_INCLUDE_GUARD_70970980877 #include "B.hpp" class A { B b; public: A(); void doA(); }; #endif // H_A_INCLUDE_GUARD_70970980877 // A.cpp #include "A.hpp" A::A() { b.doB(); doA(); } void A::doA() { }initFunktionen braucht man in C++ grundsätzlich nicht, dafür gibt es Konstruktoren.
2. Include Guards ist ein wichtiges Stichwort bei einer solchen Aufteilung!
3. Ein paar weiterführende Links:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39498.html
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39477.html
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html
http://www.c-plusplus.net/forum/viewtopic-var-t-is-61231.html
Grüssli
-
vorwärtdeklaration hab ich eh schon,
nur die klasse B stammt nicht aus meiner Feder, so dass ich die eigentlich nicht bearbeiten kann oder besser sollteDas wäre eigentlich nur der letzte ausweg
dieses beispiel mit a und b ist natürlich nicht der realität entsprechend, also ich hab der einfachkeit halber mal alles als public geschrieben
-
bevor jetzt noch solche meldungen kommen:
NICHT auf den inhalt von a und b achten ^^Diese Klassen gibt es so nicht
Nur habe ich versucht das Problem der Kommunikation so deutlich wie möglich zu machen, auch der Inhalt der Funktionen ist nicht von BelangIm realen Projekt sind Include_Guards und Konstruktoren definiert, alles kein Problem ^^
-
Habe ich deine Frage etwa falsch verstanden?
-
nein, deine antwort ist in etwa das was ich erwartet habe ( nur dass ich lieber zeiger statt referenzen verwende^^)
Auch die Funktionsnamen wie init sind frei erfunden.
Gibts ausser dieser Möglichkeit noch irgendeine wobei ich B nicht verändern müsste?
@ Drakon:
Ich will nur sicherstellen dass ich in diesem Thread nicht nach meiner Antwort suchen muss weil 200 Seiten Fehler am Beispiel bemängelt werden
wie Sourcecode aufteile, Include_Guards, hey Klasse B ist nicht mit Semikolon beendet^^@ Dravere:
ist nicht böse gemeint du hast ja recht, ich hätte vlt gleich schreiben sollen dass das nur ein Beispiel ist um das Problem mit minimalem Kontext widerzugeben
-
Ich verstehe nur Bahnhof. Das sollte keine Korrektur darstellen, sondern die Lösung. Was ist denn dann deine Frage? Oder was ist das Problem?

Grüssli
-
Er will, dass A ein Objekt hält, dieses gehaltene Objekt aber eine Funktion von A aufrufen soll. Das geht, indem man eine Referenz an das B Objekt mitgibt.
-
ok, das Problem ist sogut wie gelöst, nur hab ich noch ein kleines Problem,
für eine weitere Vorwärtsdeklaration brauch ich eine Klasse die im Namespace ns steckt.namespace ns { class C { tolle Sachen ... }; }Das ist jetzt eig mehr als peinlich, aber ich bin grad fix und fertig
wie drücke ich aus dass die Klasse im namespace ist?!
ich habe bisher:
class C; class D { wiederWasLustiges(C* caller); }Verständlicherweise?! regt er sich nun auf dass er keinen Prototyp für
wiederWasLustiges(ns::C* caller)
findet.
schreibe ich aber vor class C noch
namespace ns,
so regt er sich auf dass ns kein namespace wäreIch möchte aber unter gar keinen Umständen
die Headerdatei mit der Klasse C und dem Namespace im Header von D inkludieren.Wenn ich das hinter mir habe hör ich für heute auf ^^
-
namespace ns { class C; } class D { wiederWasLustiges(C* caller); }
-
drakon schrieb:
Er will, dass A ein Objekt hält, dieses gehaltene Objekt aber eine Funktion von A aufrufen soll. Das geht, indem man eine Referenz an das B Objekt mitgibt.
Ehm, ok. Ich hatte heute Nachmittag keinen Kaffee, vielleicht liegt es daran, dass ich das nicht begriffen habe

@shisha,
Mit dem letzten Beitrag von drakon sollte jetzt alles geklärt sein, oder?Grüssli
-
Dravere schrieb:
drakon schrieb:
Er will, dass A ein Objekt hält, dieses gehaltene Objekt aber eine Funktion von A aufrufen soll. Das geht, indem man eine Referenz an das B Objekt mitgibt.
Ehm, ok. Ich hatte heute Nachmittag keinen Kaffee, vielleicht liegt es daran, dass ich das nicht begriffen habe

Ich dachte, wegen deinem Post, dass ich etwas falsch verstanden hatte, da du überhaupt nichts in der Art, wie ich hattest.
