2011-07-21 16 views
15

नीचे दिए गए कोड में, कंपाइलर mClass2 के लिए शिकायत क्यों नहीं करता है?सी ++ - कन्स्ट्रक्टर निजी है तो यह क्या कर रहा है?

class CMyClass{ 
private: 
    CMyClass(){} 
}; 

void TestMethod(){ 
    CMyClass mClass1; //Fails. 
    CMyClass mClass2(); //Works. 
} 
+0

http://stackoverflow.com/questions/4296090/some-problems-while-learning-stl/4296118#4296118 संबंधित –

+1

के रूप में भी जाना जाता है: (देखें http सबसे अप्रिय पार्स: // एन। wikipedia.org/wiki/Most_vexing_parse) –

उत्तर

16

क्योंकि तुम सिर्फ एक समारोह शून्य की mClass2 तर्क है कि एक CMyClass रिटर्न घोषित कर दिया है। यह एक मान्य विकल्प है क्योंकि कह सकता है, static CMyClass उदाहरण जो उस फ़ंक्शन तक पहुंच है। ध्यान दें कि CMyClass में अभी भी एक सार्वजनिक प्रतिलिपि निर्माता है।

(अपने आप को समझाने के लिए, कोडांतरक और देख सकते हैं कि लाइन CMyClass mClass2(); बाहर टिप्पणी एक ही उत्पादन का उत्पादन करने के लिए इस मॉड्यूल संकलित करें।)

+1

इसके अलावा, एक मान्य चाल कन्स्ट्रक्टर। – Arafangion

+0

बहुत बहुत धन्यवाद। :) – R4D4

10

क्योंकि यह एक समारोह की घोषणा की है और निर्माता बुला नहीं के रूप में आपको लगता है।

इसे Most Vexing Parse सी ++ में कहा जाता है।

CMyClass mClass2(); 

एक समारोह mClass2() जो कोई पैरामीटर लेता है और रिटर्न CMyClass

+0

** अधिकतर परेशानी पार्स ** - यह नहीं कह सकता कि मैंने पहले कभी इसके बारे में सुना है, मैं इसे देख लूंगा, धन्यवाद। :) – R4D4

+0

@ आर 4 डी 4: आपके लिए देखने के लिए लिंक जोड़ा गया :) –

1

दूसरा एक एक समारोह घोषणा है की घोषणा की।

0

लोगों को {} ब्रैकेट्स का उपयोग करके सी ++ 0x/C++ 11 में वर्दी सिंटैक्स प्रारंभिक स्थान पर जाना चाहिए, जिसके बजाए इस समस्या को हटा दिया जाता है।

कक्षा सी {};

http://www2.research.att.com/~bs/C++0xFAQ.html#uniform-init

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