2011-12-02 18 views
13

Qualcuno è a conoscenza di un'implementazione di shared_ptr e weak_ptr insieme a un partner di inizializzazione pigro? I requisiti delle classi erano:puntatori condivisi, deboli e pigri in C++

  • Una classe lazy_ptr che consente a un cliente di costruire l'oggetto più tardi (se non del tutto), senza la necessità della realizzazione costruttore

  • Una classe weak_lazy_ptr che ha tre possibili stati : non ancora costruito (non agganciare un shared_ptr), costruito (si blocca a un shared_ptr) e distrutta (non agganciare un shared_ptr)

I creato alcune classi che non hanno fatto il lavoro completamente qualche tempo fa (see CVu article here) che utilizzavano shared_ptr e weak_ptr nella loro implementazione. I principali problemi con un modello che utilizza i puntatori condivisi e di debolezza, invece di integrarsi con li seguono:

  1. Una volta che tutti lazy_ptr oggetti andare fuori del campo di applicazione, eventuali riferimenti deboli non possono più essere bloccati, anche se altri clienti stanno tenendo shared_ptr versioni

  2. Costruzione degli oggetti su diversi thread non possono essere controllati

apprezzerei tutto puntatori ad altri tentativi di conciliare questi problemi, o per qualsiasi lavoro i n progressi possono esserci in questa area.

+6

Sembra quasi come 'shared_ptr >', giusto? – GManNickG

+2

@ user1078210 Forse puoi trovare maggiori informazioni [qui] (http: // StackOverflow.com/domande/878.166/è-non-c-lazy-pointer). – ealves

+0

@GMan: 'boost :: optional' * fa * consente la costruzione differita, ma' boost :: shared_ptr' consente anche questo, quindi entrambi non sono necessari, se ti capisco. –

risposta

2

Per creare costruzione differita che non richiede parametri:

boost::bind(boost::factory<T*>(), param1, param2) creerà un oggetto funzione che esegue l'equivalente di new T(param1, param2) senza necessità dei parametri al momento della costruzione.

Per creare una shared_ptr che supporta questa costruzione differita:

Bundle vostra fabbrica con lo standard boost::shared_ptr (in una classe di tua creazione, per esempio), e you'llget i risultati che descrivono, tra cui il appropriata weak_ptr funzionalità ...

Qualunque sia il codice innesca la differita costruzione dal cliente dovrebbe funzionare:

your_shared_ptr.reset(your_factory()); 

Qualunque sia il codice innesca distruzione dell'oggetto dovrebbe funzionare:

your_shared_ptr.reset(); 

Il puntatore condivisa evauluate a true solo durante la vita dell'oggetto. E se vuoi differenziare "non ancora costruito" da "distrutto", puoi impostare un bool dopo l'esecuzione della fabbrica.