2017-02-08 13 views
12

क्या किसी ओवरलोडेड कन्स्ट्रक्टर के लिए किसी भी तरह से कक्षा के भीतर एक और कन्स्ट्रक्टर को कॉल करना संभव है, नीचे दिए गए कोड के समान?क्या सी ++ में कोई सुविधा निर्माता है?

class A { 
public: 
    A(std::string str) : m_str(str) {} 
    A(int i) { *this = std::move(A(std::to_string(i))); } 

    std::string m_str; 
}; 

उपरोक्त कोड काम करता है, फिर भी मुझे डर है कि इसे कन्स्ट्रक्टर में कॉल करने से अपरिभाषित व्यवहार हो सकता है।

यदि आप ऐसा कर सकते हैं तो कृपया बताएं कि एक बेहतर विकल्प क्यों और सुझाव भी देते हैं?

+6

अवधि आप देख रहे हैं "प्रतिनिधि कंस्ट्रक्टर्स" है। – nwp

+1

क्यों नहीं 'ए (int i): m_str (std :: to_string (i)) {} '? – CoryKramer

+2

यह एक न्यूनतम उदाहरण है। मैं एक कन्स्ट्रक्टर को अधिभारित करना चाहता हूं जो 7 मानकों को स्वीकार करता है, जिनमें से 4 में डिफ़ॉल्ट मान हैं और मैं एक से अधिक स्थानों में डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से सेट करना चाहता हूं। – Makaronodentro

उत्तर

23

सी ++ 11 शुरू की delegating constructors:

class A 
    { 
    public: 
    std::string m_str; 
    A(std::string str) : m_str(str) {} // target constructor 
    A(int i) : A(std::to_string(i)) {} // delegating constructor 
    }; 
+7

'm_str (std :: move (str)) के लायक हो सकता है। – juanchopanza

+0

यह ध्यान देने योग्य हो सकता है कि लक्षित कन्स्ट्रक्टर को प्रतिनिधि कन्स्ट्रक्टर के समक्ष बुलाया जाता है, इसलिए बाद के शरीर में, आप मान सकते हैं कि पूर्व को बुलाया गया था। –

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