Eine Instanz einer Klasse in einer anderen Klasse aufrufen
-
@manni66
Nein, aber ein anderes Problem, wie ich einen richtigen Output bekomme, löst sich meiner Meinung nach damit, das Problem mit den Instanzen, wie in diesem Post beschrieben, zu lösen.
Also das Problem bleibt bei den Instanzen. ^^
-
@It0101 @manni66
Sorry für die Verwirrung. Werde das in meinem nächsten Post besser machen
Also das Problem, dass ich hab bleibt bei den Instanzen. Nur durch die Lösung dieses Problems lässt sich widerrum ein anderes Problem lösen, aber darum geht meine Frage auch nicht.Um näher ins Detail zu gehen:
In der Main.cpp erstelle ich die Instanz von ServerNet und ServerSys. Diese müssen sich aber gegenseitig in dessen Sourcecode ansprechen. Also zum Beispiel inServerSys
mitserverNet.funktion()
und inServerNet
mitserverSys.funktion()
.
Ich weis allerdings nicht, wie ich diese untereinander ansprechen kann, ohne nicht eine neue Instanz zu erstellen, so wie ich es bis jetzt inServerNet.cpp
in Zeile33
, oder inServerSys
in Zeile37
tue. Es müssen die Instanzen angesprochen werden, die in derMain.cpp
erstellt wurden.
-
Interne Klassen (bzw. deren Instanzen) sollten direkt keinen Zugriff auf UI-Elemente haben.
Auch das Anlegen der
ServerNet
-Variable in dermain
ist sinnfrei, solange du sie nicht dem UI-ElementServerSys
bekanntmachst (also z.B. per Referenz als Konstruktorparameter:ServerSys(ServerNet &serverNet)
und dann als Referenz-Member ablegst - oder aber sie gleich direkt als Member anlegst).Und in der
ServerSys
-Klasse greifst du dann nur auf diesen Member zu (anstatt neueServerNet
-Instanzen dort anzulegen).Und in der
ServerNet
-Instanz entkoppelst du den Zugriff auf die UI, indem du ein Signal erstellst, welches dann von derServerSys
-Instanz als Slot entgegengenommen wird (Stichwort: ereignisorientiert).
-
@Th69 sagte in Eine Instanz einer Klasse in einer anderen Klasse aufrufen:
Interne Klassen (bzw. deren Instanzen) sollten direkt keinen Zugriff auf UI-Elemente haben.
Auch das Anlegen der
ServerNet
-Variable in dermain
ist sinnfrei, solange du sie nicht dem UI-ElementServerSys
bekanntmachst (also z.B. per Referenz als Konstruktorparameter:ServerSys(ServerNet &serverNet)
und dann als Referenz-Member ablegst - oder aber sie gleich direkt als Member anlegst).Und in der
ServerSys
-Klasse greifst du dann nur auf diesen Member zu (anstatt neueServerNet
-Instanzen dort anzulegen).Und in der
ServerNet
-Instanz entkoppelst du den Zugriff auf die UI, indem du ein Signal erstellst, welches dann von derServerSys
-Instanz als Slot entgegengenommen wird (Stichwort: ereignisorientiert).this!
Es ist auch kein Problem, dass ServerNet ein Member von ServerSys(Window) ist.
ServerSys DARF ServerNet kennen. Nur andersherum nicht.
Wenn du aus ServerNet Informationen rausholen willst:- Signal in ServerNet einbauen. Slot in ServerSys. Beides verbinden.
- GetterFunktion in ServerNet einbauen, die von ServerSys aus aufgerufen wird
-
Ich habe es mit
this
in ServerNet.cpp versucht:void ServerNet::receiveRequest() { std::string receivedRequest; socket->waitForReadyRead(2000); receivedRequest = socket->readAll().toStdString(); if(receivedRequest == "label270") { ServerSys serverSys; serverSys.sendData(this); } else { std::cout << "No valid data request" << std::endl; exit(1); } }
Ich habe es mit einem Getter in ServerNet.cpp versucht:
ServerNet ServerNet::getServerNet() { return *this; }
Allerdings bekomme ich bei jedem
this
den Fehler:ServerNet.cpp:33:28: error: copying parameter of type 'ServerNet' invokes deleted constructor ServerNet.hpp:9:19: note: copy constructor of 'ServerNet' is implicitly deleted because base class 'QObject' has a deleted copy constructor qobject.h:467:20: note: 'QObject' has been explicitly marked deleted here
Keine Ahnung, was ich dagegen machen kann. Weist du noch was?
-
@Coop4Free sagte in Eine Instanz einer Klasse in einer anderen Klasse aufrufen:
Allerdings bekomme ich bei jedem this den Fehler:
Nein.
-
@Coop4Free sagte in Eine Instanz einer Klasse in einer anderen Klasse aufrufen:
QObjects haben keinen öffentlichen Copy Constructor oder Assignment Operator. Du kannst aber einen Pointer auf das Objekt zurück geben:
ServerNet* ServerNet::getServerNet() { return this; }
-
@Coop4Free bist du sicher, dass du dich schon an Sockets und QT-Frameworks heranwagen willst?
Aus meiner Sicht bist du einfach noch nicht soweit.
-
@Coop4Free sagte in Eine Instanz einer Klasse in einer anderen Klasse aufrufen:
ServerSys serverSys; serverSys.sendData(this);
Das ist weiterhin falsch!
Edit: Hast du etwa
@It0101 sagte in Eine Instanz einer Klasse in einer anderen Klasse aufrufen:this!
falsch verstanden??? Damit hat @It0101 nur seine Bestätigung ausgedrückt.
LOL
-
Ich habe es mit beiden von dir vorgeschlagenen Lösungen versucht, aber egal was ich versuche, ich bekomme es einfach nicht hin. Vermutlich nicht, weil deine Lösungsvorschläge falsch sind, sondern weil ich sie nur falsch umsetze und andauernd gibt es irgendwelche Fehler.
Da ich es für meine Arbeit brauche, muss ich es tun, ob ich dem Thema gewachsen bin, oder nicht.Könntest du mir bitte ein Codebeispiel für deine Lösungen schreiben? Das wäre sehr hilfreich.
-
Am besten du postest mal deinen grundlegenden Aufbau, ohne Inhalt. D.h. wer kennt wen, wer besitzt wen, wer ist mit wem über welchen Slot verbunden.
Nur Klassen und Funktionshüllen mal zeigen. Inhalt ist uninteressant, denn du hast ein strukturelles Problem, selbst wenn man mal ausnahmsweise außen vor lässt, dass du versuchst QObjects zu kopieren.
-
Das wäre wohl ersteinmal das beste, wobei Fehleranalyse und -behebung zu den wichtigsten Fähigkeiten eines (Software-)Entwicklers gehört.