2010-07-15 8 views
8

Ich habe eine Klasse mit einem Array von Bereichen Zeiger auf Objekte, die keinen Standardkonstruktor haben.Korrekter Weg, um ein Array von boost :: scoped_ptr zu initialisieren?

Der einzige Weg, die ich gefunden habe, um „initialisieren“ wird sie swap() wie folgt aus:

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

Das fühlt sich ein wenig ausführlich und klobig. Habe ich einen klügeren Weg verpasst?

Antwort

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

Wie erwartet, hatte ich den offensichtlichen Weg verpasst. Vielen Dank! – Roddy

+0

Danke! Ich kann nicht glauben, dass ich das übersehen habe. – Vortico

1

Wie wäre es mit einem Typdef?

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

Das größte Problem ist, dass es keine Möglichkeit gibt, hier ein Array mit der Elementinitialisierung Liste zu initialisieren. Sie könnten einen speziellen Zeiger-Container wie ptr_vector stattdessen verwenden möchten:

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

Eine Lösung: Verwenden Sie boost::ptr_vector anstelle eines Arrays.

Sie können auch std::vector<scoped_ptr> verwenden und das Array mit push_back füllen. Edit: Ich denke, das wird nicht mit scoped_ptr funktionieren.

Verwandte Themen