2010-08-12 11 views
17

मैंने अभी हाल ही में स्कोप गार्ड सी ++ मुहावरे के बारे में सीखा है। दुर्भाग्य से मुझे इसका कोई अच्छा कार्यान्वयन नहीं मिल रहा है।मुझे अपने सी ++ परियोजनाओं के लिए एक अच्छा स्कोप गार्ड कार्यान्वयन कहां मिल सकता है?

क्या कोई मुझे सी ++ में कुछ अच्छे और उपयोग योग्य स्कोप गार्ड कार्यान्वयन के लिए इंगित कर सकता है?

धन्यवाद, बोडा साइडो।

+0

इससे पहले कभी नहीं सुना - दूसरों के लिए मुझे झूठ बोलते हैं, http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Scope_Guard देखें। ऐसा लगता है कि यह बहुत उपयोगी नहीं है, आईएमएचओ। और यह लागू करने के लिए तुच्छ है - आपको "कार्यान्वयन खोजने" की आवश्यकता नहीं है। –

+0

@Neil: दिलचस्प है क्योंकि यह एक आरएआईआई से संबंधित मुहावरे से अपेक्षा की अपेक्षा से काफी अलग है। मुझे आश्चर्य है कि सफल निष्पादन के बाद संसाधन कौन संभालता है। –

+0

@Matthieu मुझे भी। स्क्रू-अप के लिए अतिरिक्त संभावनाओं को छोड़कर, मैं स्मार्ट पॉइंटर्स पर क्या देख सकता हूं। –

उत्तर

8

स्कोपगार्ड को Loki लाइब्रेरी में शामिल किया गया है (एंड्री अलेक्जेंड्रेस्कू द्वारा आधुनिक सी ++ डिज़ाइन में विज्ञापित, मुझे यकीन है कि आपने इस महान पुस्तक के बारे में सुना है), और उत्पादन कोड, इमो में उपयोग करने के लिए काफी परिपक्व है।

बस स्पष्ट होने के लिए: हम आरएआईआई का उपयोग कर अपवाद सुरक्षित कोड लिखने के बारे में बात कर रहे हैं।

अतिरिक्त पढ़ने (StackOverflow पर): Does ScopeGuard use really lead to better code?

+0

हां, मैंने आधुनिक सी ++ डिज़ाइन के बारे में सुना है। लेकिन मैंने इस पुस्तक को नहीं पढ़ा है क्योंकि इसे समझना बहुत मुश्किल है! मैं शायद कभी भी एक वाक्य में एक वाक्य समझ सकता हूं। :) – bodacydo

+0

@ बोडा वास्तव में, मुझे लगता है कि यह स्पष्ट रूप से लिखा गया है। मुझे लगता है कि समस्या यह है कि वह हमेशा जो कुछ भी बोल रहा है उसके लिए प्रेरणा को पूरी तरह से स्पष्ट नहीं करता है, लेकिन उम्मीद करता है कि आप उन्हें जान लें। –

+1

मुझे आधुनिक सी ++ डिज़ाइन पहले मिला था लेकिन हास्केल पर एक ट्यूटोरियल पढ़ने और टेम्पलेट्स पर सामान पढ़ने के बाद मैंने इसे अच्छी तरह से समझ लिया और पीछे की ओर मुझे पता नहीं था कि उसे अलग-अलग क्या करना चाहिए था। इसे वापस आना जारी रखें, यह वास्तव में अच्छी किताब है – odinthenerd

0

ए 'स्कोप गार्ड "वस्तु बहुत व्यापक RAII मुहावरा का सिर्फ एक उदाहरण है।

और इसका कोई भी कार्यान्वयन नहीं है। यह कुछ ऐसा है जो सी ++ प्रोग्रामर को समझता है, न केवल प्रतिलिपि/पेस्ट करें। सौभाग्य से, यह लागू करने के लिए भी बहुत छोटा है।

आप एक वर्ग बनाते हैं जो किसी प्रकार के संसाधन का प्रतिनिधित्व करता है। जब कक्षा को तत्काल (उसके रचनाकारों में से एक द्वारा) किया जाता है, तो उसे संसाधन प्राप्त करना चाहिए, और यदि विफल हो जाता है तो अपवाद फेंकना चाहिए। जब कक्षा नष्ट हो जाती है, तो उसे सभी आवश्यक सफाई करने के लिए संसाधन का निपटान करना चाहिए।

और ... यह है। आपको कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर को संभालना होगा (या तो संसाधन क्लोन करके या इन दो कार्यों को निजी बनाकर, जिन्हें कभी नहीं कहा जाता है)।

आपको "एक अच्छा कार्यान्वयन" खोजने की आवश्यकता नहीं है, क्योंकि आप दर्जनों और दर्जनों विभिन्न कार्यान्वयन स्वयं लिखने जा रहे हैं। वे लिखने के लिए तुच्छ हैं, और उन्हें आसानी से पुन: उपयोग नहीं किया जा सकता क्योंकि प्रत्येक व्यक्ति एक अलग प्रकार के संसाधन को लपेटता है।

+0

धन्यवाद, आधा, मैं अपना खुद का लिखने की कोशिश करूंगा। लड़का, क्या यह मेरे लिए एक कठिन अभ्यास होगा। मैंने कभी भी जटिल कोड लिखने का सपना देखा नहीं है! – bodacydo

+9

एक अच्छी स्कोप गार्ड क्लास का लाभ यह है कि यह साफ-सफाई पर मनमाने ढंग से कोड को कॉल करना आसान बनाता है, बिना दर्जनों और दर्जनों विभिन्न कार्यान्वयन स्वयं लिखने के लिए। –

14

मूल स्कोपगार्ड कक्षा this Dr. Dobb's article में आंद्रेई अलेक्जेंड्रेस्कु और पेट्रू मार्जिनन द्वारा शामिल की गई है। जोशुआ लेहरर के कुछ बदलावों के साथ here उपलब्ध है, थोड़ा बेहतर संस्करण। (लेहरर का संस्करण वह है जिसे मैं अपनी परियोजनाओं में उपयोग कर रहा हूं।) यह Loki लाइब्रेरी में भी शामिल है।

बूस्ट में अब ScopeExit लाइब्रेरी है जो स्कोपगार्ड से अधिक शक्तिशाली है (क्योंकि यह मनमानी कोड निष्पादित कर सकती है, जबकि स्कोपगार्ड केवल एक पूर्ववर्ती फ़ंक्शन को कॉल कर सकता है)।

संपादित करें: उन सभी के साथ, एक स्कोप गार्ड वास्तव में केवल आरएआईआई का एक विशिष्ट अनुप्रयोग है, इसलिए आपको वास्तव में कम से कम एक को कार्यान्वित करने की अवधारणा को समझना चाहिए।

+0

चूंकि यह उत्तर लिखा गया था, सी ++ 11 बाहर आया, और उसके बाद - एक नया स्कोपगार्ड, पहले से काफी अच्छा है; @MikeEllery द्वारा [इस एक] (http://stackoverflow.com/a/30652029/1593077) के पक्ष में अपना उत्तर बहिष्कृत करने पर विचार करें। – einpoklum

0

मानक लाइब्रेरी में scope_guard जोड़ने का एक प्रस्ताव है। आप पेपर पढ़ सकते हैं, जिसमें नमूना कार्यान्वयन शामिल है जिसे आप कॉपी/पेस्ट कर सकते हैं, here। कार्यान्वयन के लिए खंड 9.1 देखें।

4

फोली लाइब्रेरी (फेसबुक से ओपन-सोर्स) भी एक कार्यान्वयन प्रदान करता है (एए के बाद से आश्चर्य की बात नहीं है।उनके द्वारा प्रयोग किया जाता है):

https://github.com/facebook/folly/blob/master/folly/ScopeGuard.h

मैं इस बारे में सोच और MNMLSTC कार्यान्वयन यहाँ उल्लेख दोनों के लायक विचार कर रहे हैं।