कब / क्यों मैं स्पष्ट रूप से अपने निर्माता को हटाना चाहूंगा? यह मानते हुए कि इसके उपयोग को रोकने के लिए, बस इसे क्यों नहीं बनाया जाए private?
class Foo
{
public:
Foo() = delete;
};
कब / क्यों मैं स्पष्ट रूप से अपने निर्माता को हटाना चाहूंगा? यह मानते हुए कि इसके उपयोग को रोकने के लिए, बस इसे क्यों नहीं बनाया जाए private?
class Foo
{
public:
Foo() = delete;
};
delete । प्रश्न और लुचियन दोनों का उत्तर आसानी से रचनात्मक के रूप में योग्य है। कोई भी C ++ 11 के महीन बिंदुओं पर सांस नहीं ले रहा है, लेकिन जल्द ही दोनों में से कुछ पाने की जरूरत होगी।
जवाबों:
कैसा रहेगा:
//deleted constructor
class Foo
{
public:
Foo() = delete;
public:
static void foo();
};
void Foo::foo()
{
Foo f; //illegal
}
बनाम
//private constructor
class Foo
{
private:
Foo() {}
public:
static void foo();
};
void Foo::foo()
{
Foo f; //legal
}
वे मूल रूप से अलग चीजें हैं। privateआपको बताता है कि केवल कक्षा के सदस्य ही उस पद्धति को कह सकते हैं या उस चर (या पाठ्यक्रम के मित्र) तक पहुंच सकते हैं। इस मामले में, यह staticउस वर्ग (या किसी अन्य सदस्य) की एक विधि के लिए एक वर्ग के privateनिर्माता को कॉल करने के लिए कानूनी है । यह हटाए गए निर्माणकर्ताओं के लिए नहीं है।
यहाँ नमूना ।
क्यों स्पष्ट रूप से निर्माता को हटा दें?
एक और कारण:
मैं उपयोग deleteकरता हूं जब मैं यह आश्वासन देना चाहता हूं कि एक वर्ग को एक इनिशलाइज़र के साथ कहा जाता है। मैं इसे बिना रनटाइम जाँच के प्राप्त करने के लिए एक बहुत ही सुंदर तरीका मानता हूं।
C ++ कंपाइलर आपके लिए यह जांच करता है।
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
यह - बहुत सरलीकृत - कोड आश्वासन देता है कि इस तरह कोई तात्कालिकता नहीं है:Foo foo;
Fooकई कंस्ट्रक्टर थे, तो बस एक डिफ़ॉल्ट नहीं है, तो Foo foo;यह एक बहुत लंबी त्रुटि का कारण होगा जो सभी अनुमानित रूप से परिभाषित, संरक्षित और निजी निर्माणकर्ताओं को सूचीबद्ध करने में विफल रहा।
मैं एलएलवीएम के स्रोत कोड (उदाहरण के लिए AlignOf.h) में 'हटाए गए' के रूप में घोषित डिफ़ॉल्ट ctors के साथ मिला हूं। संबद्ध वर्ग टेम्पलेट आमतौर पर एक विशेष नामस्थान में होते हैं, जिन्हें 'llvm :: detail' कहा जाता है। मुझे लगता है कि पूरा उद्देश्य यह था कि वे उस वर्ग को केवल सहायक वर्ग मानते थे। उन्होंने कभी भी उन्हें पलटने का इरादा नहीं किया; केवल कुछ मेटाप्रोग्रामिंग ट्रिक्स के साथ अन्य क्लास टेम्प्लेट के संदर्भ में उनका उपयोग करने के लिए जो संकलन समय में चलते हैं।
उदाहरण के लिए। यह AlignmentCalcImpl वर्ग टेम्पलेट है जो केवल एक अन्य वर्ग टेम्पलेट के भीतर उपयोग किया जाता है जिसे AlignOf कहा जाता है जो आकार (।) ऑपरेटर के लिए एक पैरामीटर है। संकलन समय में उस अभिव्यक्ति का मूल्यांकन किया जा सकता है; और टेम्पलेट को तत्काल करने की कोई आवश्यकता नहीं है -> तो इस इरादे को व्यक्त करने के लिए डिफ़ॉल्ट ctor को हटाएं क्यों नहीं।
लेकिन यह केवल मेरी धारणा है।
= default, यहां तक कि वर्ग भी इसका उपयोग नहीं कर सकता है, और मैं व्यक्तिगत रूप से हटाए गए फ़ंक्शन का उपयोग देखना पसंद करता हूं । ओवर फंक्शन निजी है। पूर्व में स्पष्ट रूप से कहा गया है "यह उपयोग करने के लिए नहीं है।" अगर इससे कुछ भी निकलता है, तो इसका उपयोग नहीं करने वाला वर्ग वास्तव में एक शब्दार्थिक अंतर बनाता है।