2009-11-06 18 views
24

मैं एसटीएल को विशेष रूप से विधि के अलावा किसी अन्य कन्स्ट्रक्टर के साथ ऑब्जेक्ट्स प्रारंभ करने के लिए, वेक्टर में विधि आकार() के लिए कैसे बता सकता हूं, और किस पैरामीटर के साथ?एसएलएल वेक्टर और सी ++: डिफॉल्ट कन्स्ट्रक्टर के बिना कैसे करें।

मेरा मतलब है:

class something { 
    int a; 
    something (int value); 
} 

std::vector<something> many_things; 

many_things.resize (20); 

अधिक आम तौर पर, मैं कैसे एसटीएल मेरी costructor उपयोग करने के लिए जब यह वस्तुओं को बनाने की जरूरत है के लिए मजबूर कर सकता है, और है कि निर्माता के लिए पैरामीटर पास?

मेरे मामले में एक डिफ़ॉल्ट कन्स्ट्रक्टर जोड़ने का विकल्प नहीं है, और मैं समस्या को हल करने के लिए पॉइंटर्स की एक सरणी का उपयोग नहीं करना चाहूंगा।

उत्तर

43

2-तर्क अधिभार का प्रयोग करें?

#include <vector> 

class MyClass 
{ 
    private: 
     MyClass(); 
    public: 
     MyClass(unsigned i) : _data(i) {}; 

    private: 
     unsigned _data; 
}; 

typedef std::vector<MyClass> MyVector; 

void MyVector::resize(MyVector::size_type new_size) 
{ 
    this->resize(new_size, MyClass(5)); 
} 

int main() 
{ 
    MyVector vector; 
    vector.resize(5); 

    return 0; 
} 

लेकिन सोचें कि आपको वास्तव में इसकी आवश्यकता है या नहीं। इसके बजाय डिफ़ॉल्ट कन्स्ट्रक्टर क्यों नहीं बनाना है?

0

आप बफर आकार बढ़ाने के लिए reserve() का उपयोग कर सकते हैं और लूप में आवश्यक आइटम मैन्युअल रूप से (push_back()) जोड़ सकते हैं। many_things.resize(20, something(5));

+1

फिर आपके पास 'आकार बदलें' द्वारा उपयोग किए गए निहित की बजाय एक स्पष्ट हार्ड-कोडेड लूप है। –

0

विशेषज्ञता के साथ समान रूप से इस (क्षमा करें, मैं इस पर केवल न्यूनतम चेकों के साथ लिखा था):

1

मैं एक समाधान के बारे में सोच सकता हूं, लेकिन मैं आपको चेतावनी देता हूं, यह बदसूरत है। मुझे नहीं पता कि आप एक डिफ़ॉल्ट कन्स्ट्रक्टर क्यों नहीं जोड़ना चाहते हैं, लेकिन यदि आप कक्षा के उपयोगकर्ताओं को अनियमित उदाहरण बनाने के लिए रोकना चाहते हैं, तो आप केवल डिफ़ॉल्ट कन्स्ट्रक्टर को निजी बना सकते हैं और उचित वेक्टर क्लास को एक दोस्त घोषित कर सकते हैं:

class Foo { 
public: 
    Foo(int x) : num(x) {} 

    int GetX() { return num; } 
private: 
    friend class std::vector<Foo>; 

    int num; 
    Foo() : num(10) {} 
}; 

यह कई कारणों से बदसूरत है, क्योंकि ज्यादातर केवल एक कंटेनर प्रकार के लिए काम करता है। कोई दूसरा रास्ता नहीं है, क्योंकि एसटीएल कंटेनरों को बस अपने सामान को डिफ़ॉल्ट रचनात्मक होने की आवश्यकता होती है।

+2

मुझे पता चला है कि यह काम नहीं करता है क्योंकि 'std :: vector 'प्रतिनिधि दूसरे वर्ग में निर्माण करता है और इसलिए दोस्ती बेकार हो जाती है। [यहां] देखें (http://stackoverflow.com/questions/2907432/c-friend-class-stdvector) –

+0

अपडेट के लिए धन्यवाद! मुझे लगता है कि कार्यान्वयन के विवरण के आधार पर आपको क्या मिलता है। _3.5-वर्ष-पहले-me_ अनुभवी नहीं था :) –

+0

लाइव और जानें;) –

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