दिलचस्प पोस्ट
मैं अपने ऐप को पृष्ठभूमि में एक NSTimer कैसे चला सकता हूं? कैसे एक फाइल में NSLog फ़ंक्शन ऑब्जेक्ट को कॉल करते समय तर्क मूल्यांकन के आदेश की गारंटी कैसे दें? पहली पंक्ति के बाद लाइन लूप बंद होने पर शैल स्क्रिप्ट बंद हो जाती है जब नोडजे में MongoDB डेटाबेस कनेक्शन को बंद करना रैक को दिए गए कोई गुप्त विकल्प नहीं :: सत्र :: कुकी चेतावनी? गैर-अस्थायी भार और हार्डवेयर प्रीफेटर, क्या वे एक साथ काम करते हैं? इनपुट प्रकार = "file" में डिफ़ॉल्ट पाठ बदलें? आईफोन कोर डेटा "स्वचालित लाइटवेट माइग्रेशन" या तो एएनएसआई सी या आईएसओ सी क्या है -5% 10 क्या होना चाहिए? time.sleep – थ्रेड या प्रक्रिया सोता है? MySQL को कैसे – skip-grant-tables के साथ आरंभ करें? एक जावा इनपुटस्ट्रीम की आउटपुट स्ट्रीम में सामग्री लिखने का आसान तरीका जब मेरा जीसीसी सी ++ ऐप क्रैश होता है तो एक स्टैकट्र्रेस कैसे बनाया जाए JQuery में तत्व की कुल चौड़ाई (पैडिंग और सीमा सहित)

सी ++ 11 में स्पष्ट रूप से हटाए गए सदस्य फ़ंक्शंस के साथ, क्या यह एक गैर-कॉकैपीबल बेस क्लास से उत्तीर्ण करने के लिए अभी भी सार्थक है?

सी ++ 11 में स्पष्ट रूप से हटाए गए सदस्य फ़ंक्शंस के साथ, क्या यह एक गैर-कॉकैपीबल बेस क्लास से उत्तीर्ण करने के लिए अभी भी सार्थक है?

मैं उस चाल के बारे में बात कर रहा हूं जहां आप निजी तौर पर एक बेस क्लास को प्राप्त करते हैं, जिसमें निजी या हटाए गए boost::noncopyable निर्माता और प्रतिलिपि असाइनमेंट (जैसे boost::noncopyable )

क्या इस प्रश्न में अब भी सी ++ 11 पर लागू होने वाले फायदे हैं?


मुझे क्यों नहीं मिलता कि कुछ लोगों का दावा है कि सी ++ 11 में एक वर्ग को नकल करने योग्य नहीं है

सी ++ 03 में:

 private: MyClass(const MyClass&) {} MyClass& operator=(const MyClass&) {} 

सी ++ 11 में:

 MyClass(const MyClass&) = delete; MyClass& operator=(const MyClass&) = delete; 

संपादित करें:

जैसा कि बहुत से लोगों ने बताया है, खाली निकायों (यानी {}) को निजी कॉपी निर्माता और प्रतिलिपि असाइनमेंट ऑपरेटर के लिए प्रदान करने के लिए यह एक गलती थी, क्योंकि इससे क्लास स्वयं उन ऑपरेटर्स को बिना किसी त्रुटि के बोलने देगा। मैं पहली बार शुरू नहीं कर रहा था {}, लेकिन मुझे कुछ मूर्खतापूर्ण कारण (मैं परिस्थितियों को याद नहीं है) के लिए {} जोड़ दिया है कि कुछ linker मुद्दों में भाग गया मुझे पता है बेहतर पता है 🙂

वेब के समाधान से एकत्रित समाधान "सी ++ 11 में स्पष्ट रूप से हटाए गए सदस्य फ़ंक्शंस के साथ, क्या यह एक गैर-कॉकैपीबल बेस क्लास से उत्तीर्ण करने के लिए अभी भी सार्थक है?"

अच्छा तो यह:

 private: MyClass(const MyClass&) {} MyClass& operator=(const MyClass&) {} 

फिर भी तकनीकी रूप से सदस्यों और दोस्तों के द्वारा MyClass को कॉपी करने की अनुमति मिलती है बेशक, उन प्रकारों और कार्यों को सैद्धांतिक रूप से आपके नियंत्रण में है, लेकिन कक्षा अभी भी नकल है कम से कम boost::noncopyableboost::noncopyable और = delete , कोई भी क्लास को कॉपी कर सकता है।


मुझे क्यों नहीं मिलता कि कुछ लोगों का दावा है कि सी ++ 11 में एक वर्ग को नकल करने योग्य नहीं है

यह "अधिक आसानी से पचाने योग्य" के रूप में "आसान" नहीं है

इस पर विचार करो:

 class MyClass { private: MyClass(const MyClass&) {} MyClass& operator=(const MyClass&) {} }; 

यदि आप सी ++ प्रोग्रामर हैं, जिन्होंने सी ++ पर परिचयात्मक पाठ पढ़ा है, लेकिन मुहावरेदार C ++ (यानी: बहुत सारे C ++ प्रोग्रामर) के लिए बहुत कम जोखिम है, यह … भ्रमित है यह प्रतिलिपि कन्स्ट्रक्टर और प्रतिलिपि असाइनमेंट ऑपरेटरों की घोषणा करता है, लेकिन वे खाली हैं तो उन्हें क्यों घोषित करें? हां, वे private , लेकिन केवल अधिक सवाल उठाते हैं: उन्हें निजी क्यों बनाते हैं?

यह समझने के लिए क्यों नकल को रोकता है, आपको यह महसूस करना होगा कि उन्हें निजी घोषित करके, आप इसे बनाते हैं ताकि गैर सदस्य / मित्र इसे प्रतिलिपि नहीं कर सकें। यह नौसिखिया के लिए तुरंत स्पष्ट नहीं है न ही यह त्रुटि संदेश है कि जब वे इसे प्रतिलिपि बनाने का प्रयास करेंगे तो वे मिलेंगे।

अब, इसकी तुलना सी ++ 11 संस्करण से करें:

 class MyClass { public: MyClass(const MyClass&) = delete; MyClass& operator=(const MyClass&) = delete; }; 

यह समझने के लिए क्या लगता है कि इस वर्ग की नकल नहीं की जा सकती है? क्या समझने की तुलना में कुछ भी नहीं है = delete सिंटैक्स का मतलब = delete सी ++ 11 के वाक्यविन्यास नियमों को समझाते हुए कोई भी पुस्तक आपको बताएगा कि वह क्या करता है। इस कोड का प्रभाव अनुभवहीन C ++ उपयोगकर्ता के लिए स्पष्ट है।

इस मुहावरे के बारे में बहुत अच्छी बात यह है कि यह एक मुहावरा बन जाता है क्योंकि यह वास्तव में कहने का सबसे स्पष्ट, सबसे स्पष्ट तरीका है कि आप क्या कह रहे हैं।

यहां तक ​​कि boost::noncopyable थोड़ा और सोचा की आवश्यकता है। हां, इसे "नॉनकॉकेबल" कहा जाता है, इसलिए यह स्वयं-दस्तावेजीकरण है। लेकिन अगर आपने इसे पहले कभी नहीं देखा है, तो सवाल उठता है आप ऐसी चीज़ों से क्यों प्राप्त कर रहे हैं जिसे कॉपी नहीं किया जा सकता है? मेरी त्रुटि संदेशों boost::noncopyable बारे में क्यों बात करते हैं boost::noncopyable के प्रति निर्माता? आदि। फिर, मुहावरे को समझने के लिए अधिक मानसिक प्रयास की आवश्यकता है

पहली बात यह है कि जैसा कि मेरे सामने दूसरों की ओर इशारा करते हैं, आपको मुहावरे मुसीबत मिलती है, आप निजी के रूप में घोषित करते हैं और परिभाषित नहीं करते हैं :

 class noncopyable { noncopyable( noncopyable const & ); noncopyable& operator=( noncopyable const & ); }; 

जहां operator= का वापसी प्रकार operator= मूलतः कुछ भी हो सकता है इस बिंदु पर, यदि आप उस कोड को शीर्ष लेख में पढ़ते हैं, तो इसका क्या अर्थ है? यह केवल दोस्तों द्वारा कॉपी किया जा सकता है या इसे कभी कॉपी नहीं किया जा सकता है? ध्यान दें कि यदि आप अपने उदाहरण के रूप में एक परिभाषा प्रदान करते हैं, तो यह बता रहा है कि मुझे कक्षा में और मित्रों के द्वारा ही प्रतिलिपि किया जा सकता है , यह एक परिभाषा की कमी है जो इसका अनुवाद करता है, मुझे प्रतिलिपि नहीं किया जा सकता । लेकिन हेडर में परिभाषा की कमी हर जगह परिभाषा की कमी के लिए एक पर्याय नहीं है , क्योंकि इसे सीपीपी फ़ाइल में परिभाषित किया जा सकता है।

यह वह जगह है जहां गैरकॉकपीएबल नामक एक प्रकार से विरासत में मिली यह स्पष्ट करता है कि इरादा प्रतियों से बचने के लिए है, उसी तरह यदि आप मैन्युअल रूप से कोड लिखे हैं, तो आपको लाइन में एक टिप्पणी के साथ दस्तावेज़ लिखना चाहिए कि इरादा प्रतियों को अक्षम कर रहा है

सी ++ 11 इस में से कोई भी परिवर्तन नहीं करता है, यह सिर्फ कोड में दस्तावेज़ को स्पष्ट करता है। उसी पंक्ति में जिसे आप प्रतिलिपि निर्माता को हटाए गए हैं, के रूप में घोषित कर दिया गया है कि आप यह दस्तावेज पूरी तरह अक्षम हैं

आखिरी टिप्पणी के रूप में, सी ++ 11 में फीचर केवल कम कोड या बेहतर के साथ गैर-कॉम्पीएबल लिखने में सक्षम नहीं है, बल्कि कंपाइलर को उत्पन्न कोड से बाधित करने की बजाय जो आपको उत्पन्न नहीं करना चाहते यह उस सुविधा का केवल एक उपयोग है

अन्य बिन्दुओं के अतिरिक्त लाए हैं …

एक निजी प्रतिलिपि कन्स्ट्रक्टर और प्रतिलिपि असाइनमेंट ऑपरेटर रखने के लिए जिसे आप परिभाषित नहीं करते हैं, किसी को भी प्रतियां बनाने से रोकता है हालांकि, अगर कोई सदस्य फ़ंक्शन या मित्र फ़ंक्शन एक प्रतिलिपि बनाने का प्रयास करता है, तो उन्हें एक लिंक-टाइम त्रुटि मिलेगी। यदि वे ऐसा करने का प्रयास करते हैं, जहां आपने उन कार्यों को स्पष्ट रूप से हटा दिया है, तो वे एक संकलन-समय त्रुटि प्राप्त करेंगे।

मैं हमेशा जितनी जल्दी हो सके मेरी त्रुटियों को उत्पन्न करता हूं। रन-टाइम त्रुटियों को बाद में त्रुटि के स्थान पर होने के बजाय (ऐसा करने पर त्रुटि तब होती है जब आप इसे पढ़ते समय की बजाय वेरिएबल बदलते हैं)। लिंक-टाइम त्रुटियों में सभी रन-टाइम त्रुटियां करें ताकि कोड को कभी भी गलत होने का मौका न मिले। विकास को गति देने के लिए संकलन-समय की त्रुटियों में सभी लिंक-समय की त्रुटियां बनाएं और थोड़ा अधिक उपयोगी त्रुटि संदेश दें।

यह अधिक पठनीय है और कंपाइलर को बेहतर त्रुटियां देने की अनुमति देता है।

'हटाए गए' एक रीडर के लिए और अधिक स्पष्ट है, खासकर अगर वे कक्षा पर skimming रहे हैं। इसी तरह, कंपाइलर आपको यह बता सकता है कि आप एक गैर-कॉपी योग्य प्रकार की प्रतिलिपि बनाने की कोशिश कर रहे हैं, बजाय आप को 'निजी सदस्य का उपयोग करने का प्रयास' त्रुटि देने के बजाय

लेकिन वास्तव में, यह सिर्फ सुविधा सुविधा है

यहां पर लोग सिफारिश कर रहे हैं कि आप उन्हें परिभाषित किए बिना सदस्य कार्यों की घोषणा करते हैं। मैं यह कहना चाहूंगा कि ऐसा दृष्टिकोण दृष्टिकोण पोर्टेबल नहीं है कुछ कम्पाइलर / लिंकर्स की आवश्यकता होती है कि यदि आप किसी सदस्य फ़ंक्शन को घोषित करते हैं तो आपको इसे भी परिभाषित करना चाहिए, भले ही इसका उपयोग न हो। यदि आप केवल वीसी ++, जीसीसी, झगड़ा का उपयोग कर रहे हैं तो आप इसके साथ दूर हो सकते हैं, लेकिन अगर आप वास्तव में पोर्टेबल कोड लिखने का प्रयास कर रहे हैं तो कुछ अन्य कंपाइलर (जैसे ग्रीन हिल्स) असफल हो जायेंगे।