2016-04-15 4 views
6

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

क्या कोई मुझे यहां सही कर सकता है अगर मैं गलत हूं?

उत्तर

8

noexcept कार्यान्वयन के बारे में नहीं है, यह इंटरफ़ेस के बारे में है। क्या अमूर्त ऑपरेशन वर्चुअल फ़ंक्शन द्वारा दर्शाया गया है जो मूल रूप से विफल नहीं हो सकता है? फिर वर्चुअल फ़ंक्शन को छोड़ दें। यदि ऑपरेशन सैद्धांतिक रूप से विफल हो सकता है, भले ही आपके द्वारा लिखे गए कार्यान्वयन में से कोई भी नहीं कर सकता है, नहीं।

6

noexcept सदस्य फ़ंक्शन विनिर्देश का हिस्सा है, वैसे ही इसके रिटर्न प्रकार, पैरामीटर सूची और const क्वालीफायर। यह कार्य के उपयोगकर्ताओं की मदद करने के लिए है - जाहिर है, फ़ंक्शन के कार्यान्वयनकर्ताओं की कीमत पर। noexcept बिना noexcept साथ एक गैर आभासी सार्वजनिक समारोह, और एक संरक्षित आभासी समारोह -

आप एक noexcept समारोह के साथ अपने उपयोगकर्ताओं प्रदान करते हुए इसको लागू करने में अधिक लचीलापन देने के लिए की जरूरत है, कार्यों की एक जोड़ी बनाते हैं। सार्वजनिक noexcept समारोह कॉल आभासी कार्यान्वयन करें, और उन्हें अपने कॉल करने से छिपाने के लिए अपवाद संभाल:

class Base { 
protected: 
    virtual void doSomethingImpl() = 0; 
public: 
    void doSomething() noexcept { 
     try { 
      doSomethingImpl(); 
     } catch(...) { 
      // Provide some handling here 
     } 
    } 
}; 

class Derived : public Base { 
    void doSomethingImpl() { 
     ... // Implementers have flexibility to throw here 
    } 
} 
+0

आप इस संरचना उपयोग करने की आवश्यकता है, तो मैं कहता हूँ चाहते हैं, तो वहाँ कुछ अपने डिजाइन के साथ गलत है। कार्यान्वयन के अपवादों को सही तरीके से संभालने में सक्षम होने के लिए, बेस क्लास को अपने व्युत्पन्न वर्गों के बारे में बहुत कुछ पता होना चाहिए। – MicroVirus

+0

मैं माइक्रोवायरस बेस क्लास से सहमत हूं कि व्युत्पन्न कक्षाओं के बारे में ज्यादा कुछ नहीं मानना ​​चाहिए कि क्यों पहली जगह में मैं हमेशा बहुत ही कमजोर दिखने में संकोच करता हूं, भले ही ऑपरेशन बहुत छोटा लगता है –

+0

@MicroVirus ऐसा कुछ ऐसा कार्यान्वयन के खिलाफ रक्षा के रूप में उपयोगी हो सकता है जो परिस्थितियों में अप्रत्याशित रूप से फेंक सकता है जब आपके पास कार्यान्वयन पर कोई नियंत्रण नहीं होता है। अपवाद को संभालने के लिए आप बहुत कुछ कर सकते हैं * और * जारी रखें जैसे कि कुछ भी नहीं हुआ है, इसलिए अपवाद हैंडलर को लॉग इन करना चाहिए और शेष कोड को गहराई से समाप्त करना चाहिए। – dasblinkenlight

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