2013-06-09 14 views
16

मैं समझने की कोशिश कर रहा हूं कि boost के साथ आने वाली कुछ संरचनाओं का उपयोग करने का सही समय कब है और संदर्भ के साथ boost::optional के उपयोग के बारे में कोई प्रश्न था।बढ़ावा :: वैकल्पिक <T&> बनाम टी *

मान लीजिए मैं निम्नलिखित वर्ग है, boost::optional का उपयोग कर: क्यों मैं ऊपर का प्रयोग करेंगे बजाय

class MyClass { 
public: 
    MyClass() {} 

    initialise(Helper& helper) { 
     this->helper = helper; 
    } 

    boost::optional<Helper&> getHelper() { 
     return helper; 
    } 

private: 
    boost::optional<Helper&> helper; 
} 

:

class MyClass { 
public: 
    MyClass() : helper(nullptr) {} 

    initialise(Helper& helper) { 
     this->helper = &helper; 
    } 

    Helper* getHelper() { 
     return helper; 
    } 

private: 
    Helper* helper; 
} 

वे दोनों एक ही मंशा व्यक्त, यानी कि getHelpernull लौट सकते हैं , और कॉलर को अभी भी परीक्षण करने की आवश्यकता है कि एक सहायक वापस लौटाया गया हो।

क्या आपको केवल boost::optional का उपयोग करना चाहिए यदि आपको 'एक मान', nullptr और 'मूल्य नहीं' के बीच का अंतर जानने की आवश्यकता है?

+0

बढ़ावा :: वैकल्पिक सिर्फ टी के आवरण *। को बढ़ावा देने से टी * पसंद करते हैं :: वैकल्पिक वजह से बढ़ावा देने के लिए :: वैकल्पिक C++ अजीब है। टी * में बेहतर पठनीयता – jean

उत्तर

18

एक कच्चे सूचक की तुलना में, एक वैकल्पिक संदर्भ सुझाव दे सकते हैं कि (1) सूचक अंकगणित नहीं किया जाता है, और (2) दिग्दर्शन के स्वामित्व कहीं और रख-रखाव (ताकि delete स्पष्ट रूप से चर के साथ उपयोग नहीं किया जाएगा) है।

+1

हम्म है, मुझे लगता है कि यह समझ में आता है। धन्यवाद। – Lee

+7

आधुनिक सी ++ में कच्चे सूचक को पहले से ही सुझाव देना चाहिए कि स्वामित्व कहीं और बनाए रखा जाता है। –

17

महान प्रश्न, और जॉन Zwinck का जवाब ऊपर सही है। हालांकि, कुछ लोगों (जैसे, मानकीकरण समिति पर कई), शक इन कारणों optional<T&>, जब optional<T&> इस तरह के भ्रामक अर्थ विज्ञान हो सकता है के अस्तित्व का औचित्य साबित करने के लिए पर्याप्त हैं या नहीं। गौर करें कि जब आप इन लोगों में से किसी एक को असाइन करते हैं तो क्या होना चाहिए। इसे फिर से सीट चाहिए संदर्भ (यानी, वह एक अलग वस्तु की ओर इंगित करते हैं), या संदर्भ के माध्यम से आवंटित, एक असली T& करता है? किसी भी मामले के लिए एक मामला बनाया जा सकता है, जो भ्रम और सूक्ष्म बग का कारण बनता है। optional<T&> के लिए समर्थन proposal से हटा दिया गया था जिसे हाल ही में C++ 14 में स्वीकार कर लिया गया है।

संक्षेप में, यदि आप अपना कोड पोर्टेबल सी ++ 14 के std::optional पर पोर्टेबल बनाना चाहते हैं, तो T*boost::optional<T&> से अधिक पसंद करें।

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