सेंट्री ऑब्जेक्ट एक पैटर्न है, लेकिन मुझे यकीन नहीं है कि इनमें से कौन सा (शायद सभी)।
सी ++ प्रोग्राम अक्सर भारी ज्ञान पर भरोसा करते हैं जब वास्तव में एक वस्तु (उपयोगकर्ता परिभाषित वर्ग के संभवतः) नष्ट हो जाता है, अर्थात जब इसकी नाशक कहा जाता है। कचरा संग्रह वाली भाषाओं के लिए यह मामला नहीं है।
इस तकनीक का उपयोग किया जाता है, उदाहरण के लिए, "संसाधन अधिग्रहण प्रारंभ है" प्रतिमान को गले लगाने के लिए: जब आप ऑब्जेक्ट कन्स्ट्रक्टर कहलाते हैं तो संसाधनों को प्राप्त करते हैं, और संकलक स्वचालित रूप से अपने विनाशक को सामान्य और असामान्य (असाधारण) दोनों में संसाधनों को मुक्त करने के लिए कहते हैं। स्थितियां (this question देखें)।
आम स्थानों पर जहां आप निर्माण/विनाश समय के ज्ञान का उपयोग कर सकते
ब्लाकों हैं: "स्टैक-आवंटित" वस्तु के लिए एक नाशक ब्लॉक के अंत में कहा जाता है
void function()
{ Class foo = Object(resource);
other_operations();
} // destructor for foo is called here
फ़ंक्शन कॉल: "स्टैक-आवंटन" तब भी होता है जब आप फ़ंक्शन
पर कॉल करते हैं 0 void function()
{ another_function (Class(resource) );
// destructor for the unnamed object is called
// after another_function() returns (or throws)
other_operations();
}
निर्माण/युक्त वस्तु का विनाश:
class Foo
{ Class sentry;
public: Foo()
{ // Constructor for sentry is called here
something();
}
public: ~Foo()
{
something();
} // destructor for sentry is called here
};
एसटीएल में एक वर्ग sentry
कहा जाता है (अधिक वास्तव में, istream::sentry
) है, जो उन के तीसरे पैटर्न ऊपर बताई गई है । तो मुझे लगता है कि कुछ प्रोग्रामर "संत्री वस्तु" के रूप में संदर्भित हैं।
लेकिन वास्तव में कक्षा Class
की उपर्युक्त वस्तुओं में से कोई भी "प्रेषित वस्तु" कहा जा सकता है। वे "संत्री" हैं क्योंकि वे सुनिश्चित करते हैं कि कुछ अपमानजनक वस्तु विनाशक किसी भी अपवाद को फेंकने के बावजूद याद नहीं करते हैं (इसलिए वे ब्लॉक/वर्ग के अभिभावकों की तरह हैं)।
अधिक प्रेषित ऑब्जेक्ट उदाहरण RAII question में हैं।
आप पहलू उन्मुख प्रोग्रामिंग से संबंध देख सकते हैं; ये वस्तुएं "पहलुओं" की तरह कुछ हैं, "समापन ब्लॉक की शुरुआत/समाप्ति पर" कटपॉइंट्स के साथ "," वस्तु के निर्माण/विनाश पर "आदि। लेकिन इन" पहलुओं "को कोड के साथ मौजूद कोड में मौजूद है। इसलिए वे मूल call/return
कार्यक्षमता की तुलना में कम "अनुमानित" हैं; इसके बजाय, एक संतरी वस्तु वर्ग के प्रत्येक कार्य करने के लिए डाली जानी चाहिए:
class X{
struct Sentry {
Sentry() { /* call() */}
~Sentry() { /* return() */};
};
void member_function()
{ Sentry();
/* operations */
}
void another_member_function()
{ Sentry();
/* operations */
}
};
स्रोत
2010-04-22 13:31:53
इस प्रश्न के अलावा अधिकतर एक डुप्ली है, कृपया जेनेरिक सी ++ प्रश्न पूछते समय अपने प्रश्नों को किसी भी विजुअल स्टूडियो से संबंधित टैग के साथ टैग न करें। –
@Pavel मैंने खोज की और –
नहीं मिला @Pavel क्षमा करें यह मेरा पहला प्रश्न है –