7

मैं किसी फ़ंक्शन से Foo प्रकार की एक गैर-लोकप्रिय वस्तु वापस करना चाहता हूं। यह मूल रूप से एक सहायक वस्तु है जिसे कॉलर क्रियाओं का एक सेट करने के लिए उपयोग करेगा, कार्यकर्ता पूर्ण होने के बाद कुछ सफाई करने के लिए एक विनाशक के साथ।क्या यह केवल एक चालक कन्स्ट्रक्टर प्रदान करने के लिए खराब फॉर्म है?

rvalue references के आगमन से पहले, मैं shared_ptr<Foo> या कुछ ऐसा ही लौटा देता। रैवल्यू संदर्भों के साथ, एक और विकल्प कन्स्ट्रक्टर बनाने और प्रतिलिपि बनाने वाले निजी को बनाना होगा, और एकमात्र सार्वजनिक कन्स्ट्रक्टर एक चालक कन्स्ट्रक्टर होगा। Foo कुछ इस तरह दिखेगा:

class Foo : boost::noncopyable 
{ 
private: 
    Foo(/* whatever the real ctor needs */); 

public: 
    Foo(Foo && src); 

    // ... interesting stuff ... 
}; 

Foo a(SomethingThatReturnsFoo()); // allowed 
Foo b;  // error, no public default constructor 
Foo c(a); // error, noncopyable 
Foo d = a; // error, noncopyable 

मेरा प्रश्न है कि क्या यह बुरा रूप यह करने के लिए किया जाएगा है, या यह उचित लग रहा है या नहीं। मैं किसी भी कारण से नहीं सोच सकता कि इससे मुद्दों का कारण बनना मुश्किल हो सकता है या पढ़ना मुश्किल हो सकता है, लेकिन जब भी रावल संदर्भों की बात आती है, तब भी मैं कुछ हद तक नौसिखिया हूं, इसलिए ऐसे विचार हो सकते हैं जिनके बारे में मैं सोच नहीं रहा हूं।

+0

मामूली टिप्पणी: यदि आप 'मूव कन्स्ट्रक्टर' प्रदान करते हैं, तो लोग शायद 'मूव असाइनमेंट ऑपरेटर' की भी उम्मीद करेंगे। क्या आप इसे उपलब्ध कराने की योजना बना रहे हैं, या आप एक अपरिवर्तनीय वर्ग चाहते हैं? –

+0

इस विशेष मामले में यह अपरिवर्तनीय होने का इरादा है, इसलिए मुझे असाइनमेंट नहीं चाहिए, लेकिन यह सामान्य रूप से एक अच्छा बिंदु है। – Charlie

+0

बीटीडब्ल्यू, कंपाइलर से उत्पन्न प्रतिलिपि/चाल संचालन विभाग में हुए हालिया परिवर्तनों के साथ, आपको वास्तव में बूस्ट :: noncopyable से प्राप्त करने की आवश्यकता नहीं है। एक चालक कन्स्ट्रक्टर घोषित करने से पहले किसी भी अन्य प्रतिलिपि/चालन संचालन को उत्पन्न करने से संकलक को रोका जा सकता है, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm – sellibitze

उत्तर

9

यह बिल्कुल बुरा नहीं है- म्यूटेक्स या स्कोप्ड ऑब्जेक्ट्स जैसे unique_ptr जैसी वस्तुओं पर विचार करें। Unique_ptr चल रहा है लेकिन कॉपी करने योग्य नहीं है और यह एसटीएल का हिस्सा है।

+0

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

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

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