2010-07-15 14 views
8

Ho una classe con una serie di puntatori agli oggetti che NON hanno un costruttore predefinito.Modo corretto per inizializzare l'array di boost :: scoped_ptr?

L'unico modo che ho trovato per "inizializzare" li sta usando swap() come questo:

class Bar { 
    Bar(char * message) {}; 
} 

class Foo 
{ 
    boost::scoped_ptr<Bar> arr[2]; 

    Foo() 
    { 
    arr[0].swap(boost::scoped_ptr<Bar>(new Bar("ABC"))); 
    arr[1].swap(boost::scoped_ptr<Bar>(new Bar("DEF"))); 
    }; 
} 

Questo si sente un po 'prolisso e goffo. Ho perso un modo più intelligente di farlo?

risposta

15
arr[0].reset(new Bar("ABC")); 
arr[1].reset(new Bar("DEF")); 
+0

Come previsto, mi mancava il modo ovvio. Grazie! – Roddy

+0

Grazie! Non posso credere di aver trascurato questo. – Vortico

1

Che ne dici di utilizzare un typedef?

typedef boost::scoped_ptr<Bar> TBarPtr; 
arr[0].swap(TBarPtr(new Bar("ABC")); 
5

Il problema maggiore è che non è possibile inizializzare un array utilizzando l'elenco di inizializzazione dei membri qui. Si potrebbe desiderare di utilizzare un contenitore puntatore specializzati come ptr_vector invece:

struct Foo { 
    boost::ptr_vector<Bar> bars;  
    X() : bars(boost::assign::ptr_list_of<Bar>("ABC")("CDE")) {} 
}; 
1

Una soluzione: utilizzare boost::ptr_vector al posto di un array.

È anche possibile utilizzare std::vector<scoped_ptr> e riempire l'array utilizzando push_back. Edit: Penso che questo non funzionerà con scoped_ptr.

Problemi correlati