मुझे कॉन्स सदस्य चर के विचार पसंद हैं खासकर जब मैं कक्षाओं में सी कार्यों को लपेटता हूं। कन्स्ट्रक्टर एक संसाधन संभाल लेता है (उदा। एक फ़ाइल डिस्क्रिप्टर) जो पूरे ऑब्जेक्ट जीवनकाल के दौरान वैध रहता है और अंततः विनाशक इसे बंद कर देता है। (यह आरएआईआई के पीछे विचार है, है ना?)कन्स्ट्रक्टर और कॉन्स्ट सदस्य चर ले जाएं
लेकिन सी ++ 0x चालक कन्स्ट्रक्टर के साथ मैं एक समस्या में भाग लेता हूं। चूंकि विनाशक को "अनलोड" ऑब्जेक्ट पर भी बुलाया जाता है, इसलिए मुझे संसाधन हैंडल की सफाई को रोकने की आवश्यकता है। चूंकि सदस्य चर है, इसलिए मेरे पास विनाशक को इंगित करने के लिए मान -1 या INVALID_HANDLE (या समकक्ष मान) असाइन करने का कोई तरीका नहीं है कि उसे कुछ भी नहीं करना चाहिए।
क्या कोई तरीका है कि किसी ऑब्जेक्ट की स्थिति किसी अन्य ऑब्जेक्ट में स्थानांतरित हो जाने पर विनाशक को नहीं कहा जाता है?
उदाहरण:
class File
{
public:
// Kind of "named constructor" or "static factory method"
static File open(const char *fileName, const char *modes)
{
FILE *handle = fopen(fileName, modes);
return File(handle);
}
private:
FILE * const handle;
public:
File(FILE *handle) : handle(handle)
{
}
~File()
{
fclose(handle);
}
File(File &&other) : handle(other.handle)
{
// The compiler should not call the destructor of the "other"
// object.
}
File(const File &other) = delete;
File &operator =(const File &other) = delete;
};
आपका उत्तर निश्चित रूप से जाने का एक तरीका है। लेकिन सी ++ 0x से संबंधित मुझे शैली पसंद नहीं है कि विनाशकों को यह जांचना है कि क्या वाकई वास्तव में होना चाहिए। क्या उन्हें यह नहीं मानना चाहिए कि वस्तु पूरी तरह से चल रही है और चल रही है और अब विनाश का मुद्दा है? – mazatwork
@mazatwork: ठीक है, इस तरह से सोचो। मान लीजिए कि आपके पास एक जटिल वस्तु थी जो कई अलग-अलग राज्यों में हो सकती है कि प्रत्येक को विनाशकों का एक अलग सेट चाहिए। उदाहरण के लिए, उदाहरण के लिए, एक कैश है जो आरंभ किया जा सकता है या नहीं भी हो सकता है, या एक डेटाबेस कनेक्शन जो बंद होने की आवश्यकता हो सकती है या नहीं। क्या आप वास्तव में विनाशकारी नहीं हैं जब आप डेटाबेस कनेक्शन को बंद नहीं करते हैं जो आपके विनाशक में खुला नहीं है? बिलकूल नही। यह मूल रूप से एक ही बात है। आप अभी भी विनाश कर रहे हैं, यह सिर्फ इतना है कि जिस वस्तु में वस्तु है वह अधिक काम नहीं करती है। – Omnifarious
क्यों चालक कन्स्ट्रक्टर कुछ सफाई (यदि यह वास्तव में आवश्यक है) क्यों नहीं है तो विनाशक को असली विनाश के साथ छोड़ दिया जाता है। मेरी राय में यह बहुत बेहतर फिट होगा। क्योंकि हम एक ही वस्तु के बारे में बात करते हैं क्योंकि एक डबल विनाश उचित नहीं हो सकता है। जटिल वस्तुओं के साथ आपका उदाहरण एक चीज है जिसे मैं आरएआईआई और डीआई जैसी तकनीकों का उपयोग करने से बचने की कोशिश करता हूं। – mazatwork