2017-10-27 2 views
2

Können Sie mir einen Tipp geben, wie dies zu entwerfen:Vektor von Zeigern auf möglicherweise nicht vorhandene Objekte

Kurz: ich ein Objekt A habe, dass ich mit einer Liste von Objekten (Zeigern auf Objekte) wickeln will von Geben Sie B ein, das A verarbeiten soll. Das Problem ist, dass einige der B-Objekte gelöscht werden können und A nichts davon weiß. Ich weiß, dass ich mit Ausnahmen umgehen kann, aber ich würde es lieber vermeiden.

Vollständiges Problem: Ich schreibe C++ SFML-Projekt, ich möchte ein sf::RenderWindow mit einem Vektor von sf::Drawable * Zeiger auf Objekte, die dieses Fenster zeichnen sollte. Und das Problem ist das gleiche. Einige der sf::Drawable Objekte sind möglicherweise bereits gelöscht, aber sf::RenderWindow versucht, es zu verwenden.

Ich kann die Idee der Verpackung möglicherweise abbrechen, aber wenn es eine gute Designlösung gibt, wäre es großartig.

+4

Ist das nicht ein Fall für 'std :: weak_ptr'? – user0042

+1

Was meinst du mit "Umbruch mit einer Liste von Objekten"? Was bedeutet "wrap" in diesem Zusammenhang? – Galik

+0

@ user0042 'std :: weak_ptr' wird ziemlich langsam sein. – Galik

Antwort

2

können Sie ein std::unique_ptr verwenden, welche true oder false in einer if() Anweisung zurück, je nachdem ob es gelöscht wurde oder nicht:

// use a std::unique_ptr that will record if its target has been deleted 
std::vector<std::unique_ptr<sf::Drawable>> drawables; 

// deleting an element 

for(auto& drawable: drawables) 
{ 
    if(needs_to_be_deleted(drawable.get())) 
     drawable.reset(); // deletes object 
} 

// process elements 

for(auto& drawable: drawables) 
{ 
    if(drawable) // returns false if element is deleted 
    { 
     // pass by reference or pointer (using get()) 
     do_something_with_drawable(drawable.get()); 
    } 
} 
0

Sie müssen sicherstellen, dass der Speicher nicht wiederverwendet wird, da dies zu einem nicht definierten Verhalten führt, wenn das Objekt bei der Verwendung nicht mehr aktiv ist.

erstellen Karte für die Live-Objekte, und nur Gebrauchswert, wenn es noch in der Karte ist

Verwandte Themen