PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : In C++-Klasse registrierte Objekte wieder deregistrieren



Aule
11-09-2005, 16:06
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

anda_skoa
11-09-2005, 16:57
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,
_

Aule
11-09-2005, 17:24
Danke für die schnelle Antwort.

Ich hätte auch in die Richtung tendiert.

Aule

Deever
12-09-2005, 11:45
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

RHBaum
12-09-2005, 13:36
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 ...