Instanz einer Klasse in einer anderen Klasse nutzen
-
Hallo,
ich will auf eine Instanz einer Klasse in einer anderen Klasse zugreifen.
Wie genau kann man dies mit Pointer/Referenzen ohne Setter/Getter lösen?Beispiel unten:
Die Instanz der Klasse A wird im main erzeugt.
In Klasse A soll eine Funktion von Klasse B aufgerufen werden (evtl. A* a, a->function() ?)
In dieser aufgerufenen Funktion B:function sollen Variablen der Instanz classe A benutzt und beschrieben werden.Verhält sich die Lösung anders, wenn B eine abgeleitete Klasse von A ist?
Vielen Dank für die Hilfe.
fileClasseC.cpp: class A { float m_variablen; }; A:function() { hier Aufruf von b:function } fileClassB.cpp: class B { }; B:function() { nutzen und beschreiben von m_variablen } main.cpp: int main(int argc, char *argv[]) { A start; }
-
Von welcher B-Instanz soll eine Funktion aufgerufen werden?
-
also am einfachsten wäre es, die entsprechende methode in b als static zu deklarieren und dann einen float-wert zurück zu geben.
-
class A { float m_variablen; }; A:function() { B objekt; // erst Mal ein Objekt erstellen hier Aufruf von b:function --> objekt.function(m_variablen); // m_variablen übergeben } fileClassB.cpp: class B { }; B:function(float &x) //Referenz auf Float-Variable annehmen { nutzen und beschreiben von m_variablen cout << x; //nutzen von m_variablen x = 3.14; //beschreiben von m_variablen }
-
Danke.
Das Problem ist allerdings, dass ich nicht auf eine einzige Variable zugreifen will, sondern auf mehrere Variablen und structs von Class A.
objekt.function(m_variablen);
Die kann ich ja nicht alle übergeben.
-
Du könntest ja
this
übergeben. Allerdings frage ich mich, ob es nicht ggf. einen einfacheren, nicht so stark gekoppelten Weg geben würde. Das ist aber ohne genauere Problembeschreibung schwer zu sagen.
-
es hört sich ein bisschen so an, als würdest du den unterschied zwischen klasse und instanz nicht genau kennen.
in der funktion aus klasse A brauchst du ein objekt vom typ B. wenn du das hast, kein problem; die frage, die du dir stellen musst: wer erzeugt objekt a vom typ A, wer erzeugt objekt b vom typ B? alles in main?
schließlich musst du einfach "nur" sicherstellen, dass die deklaration der beiden klassen (typischerweise in header-dateien) keine instanzen der jeweils anderen klasse verwenden (nur zeiger oder referenzen).
zum "übergeben" der einzelnen instanzen reichen dann referenzen, je nachdem, was du tun willst const oder nicht.
#include "A.h" #include "B.h" int main () { //kümmert sich um erzeugung/vernichtung von allem B b; A a{b}; //*irgendwie* muss a erfahren, dass es b gibt ("setter"), außer A erzeugt seine eigenen Bs a.function(); } //A.h struct B; //vorwärtsdeklaration *ist nötig* struct A { B const& b; A (B const& b) : b{b} {} void function(); //NICHT im header definieren, weil B verwendet wird void print_result() { /* ... */ } //keine klassendefinition von B nötig, weil B hier nicht verwendet wird }; //B.h struct A; //vorwärtsdeklaration *reicht aus* struct B { void calculate(A&) const; }; //A.cpp #include "A.h" #include "B.h" //jetzt erst ist zugriff auf die klassendefinition nötig void A::function() { b.calculate(*this); } //B.cpp #include "B.h" #include "A.h" //jetzt erst ist zugriff auf die klassendefinition nötig. void B::calculate(A& a) const { a.print_result(); }
wenn B von A erbt, ändert sich im header B.h, dass hier nun A.h eingebunden werden muss. eine vorwärtsdeklaration reicht dann nicht mehr aus.
ps nicht auf include guards bzw. pragma once vergessen.