2017-05-16 8 views
8

चलो कहते हैं कि मैं निम्नलिखित कोड डालें:`getters और setters के लिए noexcept` विनिर्देशक

class A { 
    public: 
     void SetInteger(const int val) noexcept { integerMember = val; } 
     void SetString(const std::string& val) { stringMember = val; } 
     int GetInteger() const noexcept { return integerMember; } 
     std::string GetString() const { return stringMember; } 

    private: 
     int integerMember; 
     std::string stringMember; 
} 

अभिन्न प्रकार और संकेत के लिए noexcept का उपयोग करना मेरे लिए बहुत स्पष्ट लगता है।

लेकिन अभियंता/प्रति-कन्स्ट्रक्टर और उनके हिस्सों के रचनाकारों में स्पष्ट रूप से अपवाद नहीं फेंकने वाले अभिन्न प्रकारों के मामले में सिफारिशें क्या हैं (अर्थात् throw कन्स्ट्रक्टर बॉडी में उपयोग करना)?

+3

पहली जगह में getters और setters नहीं किया गया: ') –

+1

@GillBates, क्या एक उपयुक्त विकल्प है? – Alex

+7

उन्हें पहले स्थान पर रखने का क्या कारण है? आम बहाना "encapsulation" है, लेकिन आपके पास कोई भी सेट नहीं है यदि आपके दोनों सेट और तरीके विधियां सार्वजनिक हों। –

उत्तर

4

आपको उन कार्यों के लिए noexcept विनिर्देशों से बचना चाहिए जो फेंक सकते हैं (जब तक कि आप अपना कोड कॉल std::terminate() नहीं लेते)। स्पष्ट throw विनिर्देशकों को बहिष्कृत कर दिया गया है, इसलिए उन पर भरोसा न करें, बल्कि noexcept operator का उपयोग करें।

const std::string& GetString() const noexcept {return stringMember; } 

दूसरा रास्ता सेटर के लिए है: उदाहरण के

template<typename T> 
class Foo 
{ 
    T m_datum; 
public: 
    Foo& SetDatum(T const&x) noexcept(noexcept(m_datum=x)) 
    { 
    m_datum = x; 
    return *this; 
    } 
}; 
+3

मैंने 'm_' और' _' देखा है, लेकिन '_m_' ?? : ओ – BartoszKP

+3

@ BartoszKP यह एक और कदम है जब तक कि एक सत्य '_m_e_m_b_e_r_' उपसर्ग आता है। सभी इसे निराश करेंगे, और निराशा करेंगे। – Yakk

+0

@ टी.सी. क्षमा करें, इसे जांचना चाहिए था। संपादित संस्करण संकलित करता है। – Walter

1

गेटर के लिए सबसे पहले तरीके के लिए

void SetString(std::string&& val) noexcept { 
    swap(stringMember, val); 
} 
2

विशेष सदस्य कार्यों के बाहर, noexcept नहीं कि उपयोगी है। लेकिन अगर आप चाहते हैं कि उसे:

void SetString(const std::string& val) 
     noexcept(std::is_nothrow_copy_assignable<std::string>::value) { 
} 
संबंधित मुद्दे