2016-11-03 5 views
5

मुझे अविश्वसनीय रूप से गुप्त शीर्षक के लिए खेद है।एक कन्स्ट्रक्टर में सदस्य प्रारंभिकरण का उपयोग करके एक स्पष्ट निर्माता के तर्क को संतुष्ट करना क्यों ठीक है?

मैं हर्ब सटर द्वारा "अधिक असाधारण सी ++" पढ़ रहा हूं, और मैं "गिनती सूचक" के उदाहरण में आया हूं, मैं पूरे कोड को पेस्ट नहीं करूंगा, लेकिन वह हस्ताक्षर के साथ एक स्पष्ट निर्माता का उपयोग करता है:

explicit countedPointer(P* obj): p(new impl(obj)) {} 

इसके अलावा, उन्होंने एक वर्ग जो वर्ग के लिए एक निजी सदस्य के रूप में एक गिना सूचक वस्तु है, इस वर्ग के निर्माता में वाणी, वह अपने गिना सूचक initialises के रूप में इतना:

flagNth(n):pimpl_(new flagNthImpl(n)) {} 

जहां, pimpl_ काउंटर पॉइंटर ऑब्जेक्ट है, यानी

countedPointer<flagNthImpl>pimpl_; 

मैं इस कोड और main.cpp अंदर भागने की कोशिश की, अगर मैं निम्नलिखित मैं एक त्रुटि (जाहिर है, के बाद से निर्माता स्पष्ट है) मिल

int main(int argc, const char * argv[]) 
{ 
    countedPointer<int> cp = new int(5); 
} 

मेरा प्रश्न है करने की कोशिश, इसके बजाय एक निर्माता की सदस्य प्रारंभिक सूची के अंदर ऐसा करना ठीक क्यों है? प्रारंभिकरण नियमित रूप से नियमित प्रारंभ से अलग है, और यदि हां, तो कैसे?

धन्यवाद!

+2

'pimpl_ (नई flagNthImpl (एन))' 'के रूप में countedPointer सीपी में ही है (नई पूर्णांक (5))' ' – NathanOliver

+0

countedPointer cp = नई int (5),' एक काम, नहीं एक initialisation है ' गिनती सूचक सीपी (नया int (5)); 'वर्ग वाक्यविन्यास के समान है और काम करना चाहिए। – djgandy

+3

@djgandy यह निश्चित रूप से ** ** ** असाइनमेंट नहीं है। यह प्रारंभिक प्रतिलिपि है, लेकिन यह अभी भी ** प्रारंभिक ** है। – Angew

उत्तर

6

यह main में आप के लिए काम करेंगे:

countedPointer<int> cp(new int(5)); 

यह प्रत्यक्ष initialisation है और सामान्य रूप से निर्माता आह्वान करेंगे।

लेकिन, आप यह कर रहे हैं:

countedPointer<int> cp = new int(5); 

प्रतिलिपि initialisation है यही कारण है, और कहा कि स्पष्ट कंस्ट्रक्टर्स साथ काम नहीं करता। या

countedPointer<int> cp = countedPointer<int>(new int(5)); 
बेशक

, तो आप आम तौर पर बेहतर कर रहे हैं (पहला उदाहरण के रूप में) प्रत्यक्ष initialisation का उपयोग कर, प्रत्यक्ष सूची initialisation: सफलतापूर्वक एक स्पष्ट निर्माता के साथ प्रतिलिपि initialisation उपयोग करने के लिए, तो आप इस आवश्यकता होगी

countedPointer<int> cp{new int(5)}; 
+0

आह, यह समझ में आता है। तो एक निर्माता के अंदर एक वस्तु का सदस्य प्रारंभिक अनिवार्य रूप से प्रत्यक्ष प्रारंभिक है? – rmadhwal

+0

@rmadhwal हां, एक याद-प्रारंभकर्ता-सूची के अंदर प्रारंभिकरण हमेशा प्रत्यक्ष प्रारंभिकरण या प्रत्यक्ष सूची प्रारंभिक होता है। – Angew

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