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 der mainist sinnfrei, solange du sie nicht dem UI-Element ServerSys 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 neue ServerNet-Instanzen dort anzulegen).

    Und in der ServerNet-Instanz entkoppelst du den Zugriff auf die UI, indem du ein Signal erstellst, welches dann von der ServerSys-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 der mainist sinnfrei, solange du sie nicht dem UI-Element ServerSys 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 neue ServerNet-Instanzen dort anzulegen).

    Und in der ServerNet-Instanz entkoppelst du den Zugriff auf die UI, indem du ein Signal erstellst, welches dann von der ServerSys-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


  • @It0101

    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



  • @It0101

    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.


Anmelden zum Antworten