2010-04-22 12 views
13

मैं answered इस question, और Potatoswatteranswered भीसी ++ में "प्रेषित वस्तु" क्या है?

के रूप में आधुनिक सी ++ बराबर एक संतरी वस्तु होगा:, (एक समारोह के शुरुआत में यह निर्माण अपनी निर्माता को लागू करने कॉल के साथ), और वापसी (या असामान्य निकास) पर, अपने नाशक लागू करता

मैं सी ++ में संतरी की वस्तुओं का उपयोग कर से परिचित नहीं हूँ। मैंने सोचा कि वे इनपुट और आउटपुट स्ट्रीम तक सीमित थे।

किसी सी ++ संतरी वस्तुओं के बारे में मेरे लिए समझा सकते हैं और साथ ही कैसे एक कक्षा में एक या अधिक तरीकों के लिए इंटरसेप्टर के चारों ओर एक के रूप में उपयोग करने के लिए?

यानी यह कैसे करें?

सेंट्री ऑब्जेक्ट्स वास्तव में समान हैं। एक ओर वे स्पष्ट इन्स्टेन्शियशन की आवश्यकता होती है (और किया जा रहा इस पारित कर दिया), लेकिन इतना है कि वे नहीं केवल वर्ग के अपरिवर्तनशीलताओं जाँच लेकिन दूसरी ओर आप उन्हें जोड़ सकते हैं कुछ पूर्व/ समारोह के लिए पोस्ट की स्थिति उपलब्ध।

+1

इस प्रश्न के अलावा अधिकतर एक डुप्ली है, कृपया जेनेरिक सी ++ प्रश्न पूछते समय अपने प्रश्नों को किसी भी विजुअल स्टूडियो से संबंधित टैग के साथ टैग न करें। –

+1

@Pavel मैंने खोज की और –

+0

नहीं मिला @Pavel क्षमा करें यह मेरा पहला प्रश्न है –

उत्तर

15

सेंट्री ऑब्जेक्ट एक पैटर्न है, लेकिन मुझे यकीन नहीं है कि इनमें से कौन सा (शायद सभी)।

सी ++ प्रोग्राम अक्सर भारी ज्ञान पर भरोसा करते हैं जब वास्तव में एक वस्तु (उपयोगकर्ता परिभाषित वर्ग के संभवतः) नष्ट हो जाता है, अर्थात जब इसकी नाशक कहा जाता है। कचरा संग्रह वाली भाषाओं के लिए यह मामला नहीं है।

इस तकनीक का उपयोग किया जाता है, उदाहरण के लिए, "संसाधन अधिग्रहण प्रारंभ है" प्रतिमान को गले लगाने के लिए: जब आप ऑब्जेक्ट कन्स्ट्रक्टर कहलाते हैं तो संसाधनों को प्राप्त करते हैं, और संकलक स्वचालित रूप से अपने विनाशक को सामान्य और असामान्य (असाधारण) दोनों में संसाधनों को मुक्त करने के लिए कहते हैं। स्थितियां (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 */ 
    } 
}; 
+1

+1 thx इतनी अच्छी तरह से व्याख्या करने के लिए समय लेने के लिए –

+5

@ रोमियन, कोई समस्या नहीं, मैं बस अपना वास्तविक काम करने में विलंब करने के लिए अपना सर्वश्रेष्ठ प्रयास कर रहा हूं> _ < –

+2

हम सभी को यह नहीं पता ... ':)' – sbi

2

Here एक प्रेषित वर्ग के लिए एक उदाहरण है जो एक चर को अपने पुराने मान में रीसेट करता है।

+0

मुझे पोस्ट में प्रश्न का उत्तर नहीं दिखाई देता है। एक प्रेषित वस्तु एक पैटर्न है? –

+0

@ रोमेन: फिर मैंने आपके प्रश्न को गलत तरीके से पढ़ा। मैंने सोचा था कि आप पूछ रहे थे कि एक संविदा वस्तु क्या है और इसका उपयोग कैसे करें। – sbi

+0

@ रोमेन: हाँ, यह एक पैटर्न है और एक विशेष वर्ग नहीं है। आप एक स्थानीय, गैर-व्युत्पन्न, अज्ञात कक्षा का उपयोग फ़ंक्शन के भीतर एक संत्री के रूप में भी कर सकते हैं। – Potatoswatter

3

AOP के साथ अंतर यह समारोह शरीर या वर्ग परिभाषा के अंदर स्पष्ट रूप से कहीं न कहीं संतरी डालकर सहयोगात्मक किया जा सकता है कि है।

आप लक्षित फ़ंक्शन या कक्षा को संशोधित किए बिना कॉल नहीं कर सकते हैं।

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