2017-09-29 56 views
6

मैं कक्षाडिफ़ॉल्ट तर्क निर्माता की अनुमति के निजी विधि कॉल करने के

class A 
{ 
public: 
    class Key 
    { 
     Key() {} 
     Key(Key const &) {} 
    }; 

    A(Key key, int a = 5) {} 
}; 

है Key के लिए निर्माता निजी है, इसलिए कोई भी एक वस्तु A निर्माण करने के लिए सक्षम होना चाहिए। हालांकि, निम्न कोड के साथ:

int main() { 
    A a(A::Key()); // this compiles !!! 
    A a2(A::Key(), 5); // this doesn't 
    // somehow defaulting the argument causes the private constructor 
    // to be OK - no idea why 
    return 0; 
} 

मेरी निर्माता में int a के लिए डिफ़ॉल्ट तर्क का इस्तेमाल कर रही करके, संकलक खुशी से A::Key() की मेरी उपयोग तथ्य यह है कि यह निजी है के बावजूद संकलित करता है। यदि मैं स्पष्ट रूप से a के लिए मान देता हूं, हालांकि, कंपाइलर सही ढंग से पहचानता है कि मैं एक निजी निर्माता और त्रुटियों का उपयोग करने की कोशिश कर रहा हूं। ऐसा क्यों है? क्या पहले उदाहरण के लिए संकलक को त्रुटि देने के लिए मजबूर करना है?

लाइव उदाहरण के लिए here देखें।

उत्तर

7

यह सबसे अधिक परेशान पार्स की वजह से है।

A a(A::Key()); 

एक A नामित a बना सकते हैं और एक अस्थायी A::Key साथ यह निर्माण नहीं करता है। यह एक फ़ंक्शन a बनाता है जो A देता है और A::Key लौटाता है जो फ़ंक्शन में एक अनाम पॉइंटर लेता है।

आप इसे करने के कोष्ठक की एक जोड़ी जोड़ देते हैं तो आपको एक निजी निर्माता कॉल करने के लिए कोशिश कर रहे हैं यही कारण है कि एक संकलक त्रुटि

A a((A::Key())); 

मिल जाएगा। वैकल्पिक रूप से आप वर्दीधारी आरंभीकरण उपयोग कर सकते हैं जो भी यह स्पष्ट करने और एक संकलन त्रुटि

A a(A::Key{}); 
+1

कारण होगा मुझे पता था कि मैं इस कहीं से पहले ... उन चीजों मैं एक बार हर 5 साल में चलाने के लिए और क्योंकि द्वारा flummoxed हूँ में से एक देखा था मैंने इसे इतने लंबे समय तक नहीं देखा है ... मदद के लिए धन्यवाद। –

+1

@R_Kapp कोई समस्या नहीं, मदद करने में खुशी हुई। – NathanOliver

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