2013-02-20 19 views
5

Ho una struttura che gestisce oggetti che derivano da una classe base Entity, ma non ne controlla la durata. Voglio che a questa struttura vengano dati dei puntatori deboli come weak_ptr<Entity> in modo che possa sapere se l'oggetto è stato distrutto altrove.weak_ptr di una classe base, mentre il parametro shared_ptr è di una classe derivata?

Tuttavia, al di fuori della struttura di gestione in cui risiede il puntatore condiviso, voglio che il puntatore condiviso sia il più specifico shared_ptr<SpecificEntity> (SpecialEntity utilizza Entità come classe base).

C'è un modo per realizzare questo o qualcosa del genere?

risposta

11

Questo è molto possibile. È sempre possibile convertire uno in uno shared_ptr<Base> implicitamente, e per l'altra direzione si dispone di std::static_pointer_cast e std::dynamic_pointer_cast, che fanno ciò che ci si aspetta – cioè si finisce con un nuovo puntatore di diverso tipo che condivide la proprietà con il puntatore originale. Esempio:

std::shared_ptr<Base> p(new Derived); 

std::shared_ptr<Derived> q = std::static_pointer_cast<Derived>(p); 

std::shared_ptr<Base> r = q; 

O, più C++ 11-style:

auto p0 = std::make_shared<Derived>(); 

std::shared_ptr<Base> p = p0; 

auto q = std::static_pointer_cast<Derived>(p); 
+0

Ah, non sapevo che ci fossero calchi per questo! Grazie! –

Problemi correlati