Anzeige:
Ergebnis 1 bis 5 von 5

Thema: In C++-Klasse registrierte Objekte wieder deregistrieren

  1. #1
    Aule
    Gast

    In C++-Klasse registrierte Objekte wieder deregistrieren

    Hallo!

    Erstmal sorry für diesen wenig aussagekräftigen Titel.
    Nun zu meinem Problem:

    Ich habe in C++ eine Klasse LoggingSystem. Diese verwaltet intern einen std::vector< LogOutputter* >
    Über die Memberfunktion RegisterOutputter( LogOutputter* ) kann ich einen Eintrag in diese Liste hinzufügen. Soweit funktioniert alles.

    Nur habe ich jetzt ein Problem: Ich will auch wieder Pointer aus der Liste löschen können.

    Eine Möglichkeit wäre, RegisterOutputter() eine ID zurück geben zu lassen. Dann könnte ich auf Pointer anhand dieser ID (die Position im Container) zugreifen und wieder löschen. Ich dürfte sie aber nicht ganz entfernen, sondern nur auf NULL setzen, damit die anderen Positionen noch stimmen.

    Die zweite Möglichkeit wäre, den std::vector durch eine std::map zu ersetzen. Dann müsste ich aber die bis jetzt höchste vergebene ID mitzählen.

    Schließlich gäbe es noch, zum Löschen wieder den Pointer zu übergeben, die Liste durchzugehen und die in den Pointern gespreicherten Adressen mit der übergebenen zu vergleichen. Den betreffenden Eintrag würde ich löschen. Allerdings weiß ich nicht, ob das eine saubere Lösung ist.

    Was würdet ihr mit empfehlen?

    Das Programm läuft unter Linux, soll aber plattformunabhängig bleiben

    Aule

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich würde die letzte Option wählen, also den Outputter explizit beim Entfernen angeben.

    Wenn man nicht gerade die Pointer auf Outputter herumreicht, kann ihn praktisch nur der entfernen, der ihn auch eingetragen hat.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Aule
    Gast
    Danke für die schnelle Antwort.

    Ich hätte auch in die Richtung tendiert.

    Aule

  4. #4
    Registrierter Benutzer
    Registriert seit
    29.02.2004
    Beiträge
    113
    Also ich würde an dieser Stelle eine map evtl. mit dem Outputter als Keytype nehmen. Aber ich wurde auch von einer Schlange gebissen!

    Gruß,
    /dev

  5. #5
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Ich wuerd ne Liste nehmen ....
    Liste gleichzeitig als container der die Objecte haelt ...

    Also Outputter da aufn stack erzeugen und in die liste werfen (braucht dann nen CCTOR klar) ...
    wenn das erfolgreich war, Adresse des zuletzt eingefuegten objects ermitteln und zur weiterverarbeitung geben ....

    bei der liste brauchst dir dann wegen inserts und deletes (erase) keinen kopf machen ... die objecte werden da nich verschoben ...

    nur modifizierende allgorythmen (sort etc) solltest unterbinden

    wenn du weitere Assoziationen brauchst kannst dann Maps mit den zeigern anlegen ...

    Wenn du clients hasst, die fuer ihre arbeit das Object nich kennen muessen sondern nur ne ID oä benotigen (bsp wenn ueber C Schnittstellen faehrst) ... kommst eh besser du nimst die Adresse des objects , vielleicht noch als void* "getarnt" ...
    Hat den vorteil du kannst peroformante aber "unsichere" FUnktionen schreiben weil ohne probleme mit nem einfachen cast auf die objecte zugreifen, ohne nen lookup machen zu muessen ...

    Ciao ...
    Geändert von RHBaum (12-09-2005 um 13:39 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •