2013-04-07 9 views
5

का उपयोग कर सकता हूं, मुझे लगता है कि यह असंभव है लेकिन मैं भी पूछ सकता हूं। क्या मैं एक निजी प्रतिलिपि बनाने वाला घोषित कर सकता हूं और अभी भी डिफ़ॉल्ट कार्यान्वयन का उपयोग कर सकता हूं?क्या मैं कॉपी कन्स्ट्रक्टर को निजी बना सकता हूं और अभी भी डिफ़ॉल्ट कार्यान्वयन

पृष्ठभूमि: मेरे पास बहुत बड़े वैक्टर वाले वर्ग हैं और मैं एक सदस्य फ़ंक्शन को छोड़कर कॉपी कन्स्ट्रक्टर को कॉल नहीं करना चाहता हूं। एक मानक सार्वजनिक प्रति-ctor का उपयोग कर आसानी से बग की तरह हो सकता है उदा। foreach(Type const& el,vectOfBigObjects) के बजाय एक पुनरावृत्ति (foreach(Type el,vectOfBigObjects) में संदर्भ को भूलना)। इसलिए मैं मानक प्रतिलिपि निर्माता रखना चाहता हूं लेकिन इसे निजी बनाएं।

क्या यह कॉपी-सीटर्स परिभाषा को फिर से लिखने के बिना संभव है?

उत्तर

11

क्या यह कॉपी-सीटर्स परिभाषा को फिर से लिखने के बिना संभव है?

सी ++ 11 में, हाँ। तुम बस निर्माता की घोषणा और यह के रूप में चिह्नित चूक करने के लिए है:

struct X 
{ 
    // ... 
private: 
    X(X const&) = default; 
}; 

यह एक प्रति निर्माता है जो एक परोक्ष जनरेट रूप में एक ही परिभाषा होता परिभाषित करेगा, लेकिन private हो जाएगा। उदाहरण के लिए:

struct X 
{ 
    X() { } // Required because a user-declared constructor in 
      // the definition of X inhibits the implicit generation 
      // of a default constructor (even if the definition is 
      // defaulted!) 

    void foo() 
    { 
     // ... 
     X tmp = *this; // OK! 
     // ... 
    } 

private: 

    X(X const&) = default; // Default definition, accessible to 
          // member functions of X only! 
}; 

int main() 
{ 
    X x; 
    // X x2 = x; // ERROR if uncommented! 
} 

यहाँ एक live example है।

ध्यान दें, कि एक वर्ग परिभाषा में एक उपयोगकर्ता के घोषित निर्माता (कॉपी निर्माता सहित) एक डिफ़ॉल्ट निर्माता की अंतर्निहित पीढ़ी है, भले ही इसकी परिभाषा चूक है रोकता है। यही कारण है कि, उदाहरण के लिए, मुझे ऊपर दिए गए उदाहरण में X के डिफ़ॉल्ट कन्स्ट्रक्टर को स्पष्ट रूप से घोषित करना पड़ा।

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

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