2010-07-15 10 views
8

Tengo una clase con una matriz de indicadores de ámbito para objetos que NO tienen un constructor predeterminado.Forma correcta de inicializar la matriz de boost :: scoped_ptr?

La única manera que he encontrado para "inicializar" que está utilizando swap() así:

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"))); 
    }; 
} 

Esto se siente un poco más detallado y torpe. ¿Me he perdido una forma más inteligente de hacerlo?

Respuesta

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

Como esperaba, me había perdido la manera obvia. ¡Gracias! – Roddy

+0

Gracias! No puedo creer que haya pasado esto por alto. – Vortico

1

¿Qué pasa con el uso de un typedef?

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

El mayor problema es que no hay forma de inicializar una matriz usando la lista de inicializadores de miembros aquí. Es posible que desee utilizar un contenedor de puntero en lugar especializado como ptr_vector:

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

Una solución: utilizar boost::ptr_vector lugar de una matriz.

También puede usar std::vector<scoped_ptr> y completar la matriz usando push_back. Editar: Creo que esto no funcionará con scoped_ptr.

Cuestiones relacionadas