2013-01-06 31 views
5

के आधार पर एक और निर्माता मैं इस वर्गसी ++ निर्माता कॉल पैरामीटर प्रकार

class XXX { 
    public: 
     XXX(struct yyy); 
     XXX(std::string); 
    private: 
     struct xxx data; 
}; 

पहले निर्माता (जो एक संरचना के साथ काम करता है) है को लागू करने के लिए आसान है। दूसरा मैं एक स्ट्रिंग को एक विशिष्ट प्रारूप में विभाजित कर सकता हूं, पार्स और मैं उसी संरचना को निकाल सकता हूं।

XXX::XXX(std::string str) { 

    struct yyy data; 
    // do stuff with string and extract data 
    this(data); 
} 

एक और निर्माता कॉल करने के लिए this(params) का उपयोग करना:

मेरा प्रश्न जावा में मैं इस तरह कुछ कर सकते हैं, है। इस मामले में मैं कुछ समान कर सकता हूँ?

धन्यवाद

उत्तर

2

हां। सी ++ 11 में, आप यह कर सकते हैं। इसे constructor delegation कहा जाता है।

struct A 
{ 
    A(int a) { /* code */ } 

    A() : A(100) //delegate to the other constructor 
    { 
    } 
}; 
+0

क्या आप जानते हैं कि वर्तमान में कौन से कंपाइलर्स इस परिवर्तन को लागू करते हैं, मुझे लगता है कि क्लैंग उदाहरण के लिए (अभी तक) नहीं है। –

+0

@MatthieuM .: मुझे नहीं पता। किसी भी कंपाइलर के साथ इसका परीक्षण नहीं किया है। :-) – Nawaz

+0

:) मुझे डर है कि यह अभ्यास में महत्वपूर्ण नहीं माना जाता था क्योंकि एक निजी विधि के लिए प्रतिनिधिमंडल पहले से ही बहुत अच्छी तरह से काम करता है (जब तक सभी विशेषताएं असाइनमेंट का समर्थन करती हैं), और इस प्रकार सभी के लिए कम प्राथमिकता है। –

8

अवधि आप देख रहे हैं "constructor delegation" (या अधिक आम तौर पर, "श्रृंखलित कंस्ट्रक्टर्स") है। सी ++ 11 से पहले, ये सी ++ में मौजूद नहीं थे।

class Foo { 
public: 
    Foo(int x) : Foo() { 
     /* Specific construction goes here */ 
    } 
    Foo(string x) : Foo() { 
     /* Specific construction goes here */ 
    } 
private: 
    Foo() { /* Common construction goes here */ } 
}; 

आप सी ++ 11, सबसे अच्छा तुम कर सकते हो सामान सभी के लिए आम से निपटने के लिए एक निजी सहायक समारोह को परिभाषित है का उपयोग नहीं कर रहे हैं: लेकिन वाक्य रचना सिर्फ एक आधार स्तर के निर्माता लागू की तरह है रचनाकार (हालांकि यह उन चीजों के लिए परेशान है जिन्हें आप प्रारंभिक सूची में रखना चाहते हैं)। उदाहरण के लिए:

class Foo { 
public: 
    Foo(int x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
    Foo(string x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
private: 
    void ctor_helper() { /* Common "construction" goes here */ } 
}; 
+0

मैं आपका उत्तर उतार रहा हूं क्योंकि यह अधिक पूर्ण है। लेकिन उदाहरण बहुत अच्छे होंगे। :-) – Omnifarious

+2

@ अनौपचारिक: उदाहरण अब मौजूद हैं! –

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