2010-07-15 11 views
8

मेरे पास ऐसी कक्षाओं के लिए स्कोप्ड पॉइंटर्स की एक सरणी है जिसमें डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है।बूस्ट :: scoped_ptr की सरणी शुरू करने के लिए सही तरीका?

एक ही रास्ता मैं "आरंभ" के लिए उन्हें swap() इस तरह उपयोग कर रहा है मिल गया है:

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

यह एक छोटे से वर्बोज़ और भद्दा लगता है। क्या मुझे ऐसा करने का एक अच्छा तरीका याद आया है?

उत्तर

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

जैसी उम्मीद थी, मैं स्पष्ट तरीका याद किया था। धन्यवाद! – Roddy

+0

धन्यवाद! मुझे विश्वास नहीं है कि मैंने इसे अनदेखा किया है। – Vortico

1

टाइपिफ़ का उपयोग करने के बारे में क्या?

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

सबसे बड़ी समस्या एक सरणी यहाँ सदस्य प्रारंभकर्ता सूची का उपयोग कर प्रारंभ करने में कोई रास्ता नहीं है कि वहाँ है। आप ptr_vector बजाय की तरह एक विशेष सूचक कंटेनर का उपयोग करना चाहते हो सकता है:

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

एक समाधान: एक सरणी के बजाय boost::ptr_vector का उपयोग करें।

आप std::vector<scoped_ptr> का भी उपयोग कर सकते हैं और push_back का उपयोग कर सरणी भर सकते हैं। संपादित करें: मुझे लगता है कि यह scoped_ptr के साथ काम नहीं करेगा।

संबंधित मुद्दे