klasse soll sich selbst löschen



  • hej leute ich mal wieder.
    follgendes problem: kennt jemand ne möglichkeit, dass eine instanz einer klasse, die in einer anderen über new angelegt wird, einen aufruf sich selbst zu löschen tätigt?
    klasse A kann nicht verändert werden...
    zeitliche lösungen sind auch nicht möglich

    class A {  // klasse die einges erledigt. kann nicht verändert werden!!!
      public:
      int x; // "einges"
      A(int _x)
      : x(_x) {}
      boost::signals2::signal<void (A*)> sig;  // signal zum beenden
      void machwas() {
        sig(this);  // instanz wird nicht mehr benötigt. lösche
    
        // irgendwas wird noch gemacht. KANN NICHT VERÄNDERT WERDEN
        x= 34 + 123+1231+3+56+23;
        std::cout << x << std::endl;
        x= 34 + 123+1231+3+56+23;
        sleep(1);
        std::cout << x << std::endl;
        x= 34 + 123+1231+3+56+23;
        std::cout << x << std::endl;
      }
    };
    
    class B {
      public:
      A *a[10];  // instanzen
      B() {
        for(int i=0; i<10; i++)  // init
          a[i] = new A(i);
      }
      void loesche(A* _was) {  // lösche die aufrufende instanz
        delete _was;
        std::cout << "gelöscht" << std::endl;
        _was = 0;
      }
    };
    
    int main(void) {
      B b;  // erzeugen
      b.a[0]->sig.connect(boost::bind(&B::loesche, &b, _1));  // binden
      b.a[0]->machwas();  // killen
    }
    

    danke für jede hilfe
    gruß



  • Verstehe die Frage nicht.
    Vielleicht hilft Dir delete this; weiter.



  • Hier noch einige wichtige Regeln für die Verwendung von

    delete this;
    

    http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15



  • ne delete this hilft mir da glaube ich nicht weiter.
    das problem ist dass er nachdem er signaliesiert das er eigentlich nicht mehr gebraucht wird noch dinge ausführt, die ich nicht stoppen kann von außen.



  • pi88el schrieb:

    ... das problem ist dass er nachdem er signaliesiert das er eigentlich nicht mehr gebraucht wird noch dinge ausführt, die ich nicht stoppen kann von außen.

    Warum signalisiert er, dass er nicht mehr gebraucht wird, obwohl er noch
    gebraucht wird? 😮

    Wenn er dann seine komplette Arbeit verrichtet hat, dann kannst du
    doch ein delete this; aufrufen? 😕
    Wenn die Klasse selbst nicht weiß, ob sie nochmal aufegrufen wird,
    dann muss die Klasse, die sie aufruft die Verantwortung für die Zerstörung
    des Objektes übernehmen.



  • Wie immer: Erkläre, was Du erreichen willst, und nicht, wie Du es erreichen willst. So wie das hier aussieht, ist es sehr wahrscheinlich, dass es bessere Lösungen für Dein Problem gibt.



  • klasse A ist eine kommunikations-session (boost::asio) und ist für das senden und empfangen von protokolen. klasse A ist nur für die kommunikation zuständing. die verarbeitung der "signale" übernimmt klasse B. klasse B erzeugt die sessions, verarbeitet die signale, löscht die sessions wenn nicht mehr benötigt.
    eines der signale ist das die session beendet werden kann. der handler (A::machwas) empfäng signale und ruft den handler (hier nur verkürzt B::loesche. im grunde wird dan erst das signal erkannt und verarbeitet) auf, und setzt sich danach wieder in lauschmodus. falls signal beenden kommt soll die session gelöscht werden.
    hoffe das man das jetzt versteht... 🙂



  • pi88el schrieb:

    hoffe das man das jetzt versteht... 🙂

    Zumindest ich habe alleine schon mit deinen Sätzen Probleme. Fehlende Wörter, Groß-/Kleinschreibung sowie Satzzeichen, sind zum Lesen und Verstehen nicht gerade hilfreich.



  • Guck Dir mal das Beispiel HTTP2 von boost.asio an. Da wird beschrieben, wie sich Sessions bei Bedarf selbst löschen. Man sieht in Deinem Codezeugs übrigens nichts von asio...

    pi88el schrieb:

    hoffe das man das jetzt versteht... 🙂

    Nicht wirklich...


Anmelden zum Antworten