2010-08-02 11 views
5

मैं सिर्फ कोएनिग & म्यू के त्वरित सी ++ और अध्यायों में 13 & 14 के बारे में हूं, वे कुछ हैंडल वर्गों (सरल, साझा, संदर्भ गिना गया) के विचार और कार्यान्वयन को प्रस्तुत करते हैं।क्या एक स्मार्ट पॉइंटर के समान ही संभाल है?

कक्षाएं कच्चे पॉइंटर को एन्कैपलेट करती हैं और कच्चे पॉइंटर्स के सभी खतरों से बचने के लिए गतिशील ऑब्जेक्ट्स के आवंटन/विलोपन को अमूर्त करती हैं और साथ ही उपयोगकर्ता को ऑब्जेक्ट की ओर इशारा करने के लिए उन्हें अस्वीकार करने की इजाजत देता है। मूल रूप से कच्चे मेमोरी संसाधनों के साथ इंटरफेस करने के लिए एक 'सुरक्षित' तरीका।

क्या इन अध्यायों में कक्षाओं को अनिवार्य रूप से स्मार्ट पॉइंटर्स के कार्यान्वयन में प्रस्तुत किया गया है? स्मार्ट पॉइंटर्स अभी भी मेरे लिए बहुत नए हैं, लेकिन मैं समझता हूं कि इन हैंडल क्लासेस एक ही काम कर रहे हैं।

  1. क्या दोनों के बीच एक अंतर है या यह एक ही चीज़ के लिए सिर्फ एक और नाम है?
  2. मान लीजिए कि वे फ़ंक्शन में समकक्ष हैं, प्रैक्टिस में ऐसा कोई वर्ग पहले से ही बनाए गए स्मार्ट पॉइंटर समाधान का उपयोग करने के बजाय स्क्रैच से लिखा जाएगा?

संपादित

मैं जोड़ने चाहिए कि कक्षाओं वे इन अध्यायों में विकसित करने, टेम्पलेट वर्ग हैं तो वे किसी विशिष्ट संसाधन के लिए बाध्य नहीं कर रहे हैं के रूप में वे उदाहरण के लिए एक विशिष्ट filehandle वर्ग नहीं डिज़ाइन कर रहे हैं।

पहले कोड स्निपेट here, 7.1 में कोड, उन अध्यायों में जो कुछ भी मिला है, उनके बारे में काफी कुछ है।

उत्तर

6

आपके विवरण से यह एक स्मार्ट सूचक की तरह लगता है।
हालांकि व्यक्तिगत रूप से मैं शब्द हैंडल का उपयोग नहीं करता क्योंकि यह थोड़ा अस्पष्ट है (बस एक स्मार्ट सूचक को एक स्मार्ट सूचक कहते हैं)।

प्रश्न: क्या आप स्क्रैच से स्मार्ट पॉइंटर लिख सकते हैं?
ए: हाँ

प्रश्न: क्या आप अपना खुद का स्मार्ट सूचक लिखना चाहिए।
ए: नहीं। यह आपके विचार से बहुत अधिक कठिन है। यहां तक ​​कि पुस्तक में विवरण केवल जटिल समस्याओं पर चमक गया। सम्मानित पुस्तकालयों द्वारा प्रदान किए गए मानक वाले लोगों के साथ चिपकाएं।

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

प्रश्न: क्या आप कच्चे मेमोरी के बजाय स्मार्ट पॉइंटर्स का उपयोग करना चाहिए।
ए: कभी भी आरएडब्लू मेमोरी का उपयोग न करें जब तक कि पूरी तरह जरूरी न हो (जो व्यावहारिक रूप से कभी नहीं होता) हमेशा उस वर्ग में इसे समाहित करता है जो इसे प्रबंधित करता है। चाहे कक्षा एक स्मार्ट सूचक या किसी अन्य प्रकार का वस्तु है, एक अच्छा सवाल है। std :: वेक्टर को स्मार्ट पॉइंटर नहीं माना जाता है लेकिन यह एक रॉ पॉइंटर को समाहित करता है।

प्रश्न: चाहिए आप व्यापार तर्क से सार स्मृति प्रबंधन:
उत्तर: यह एक मुश्किल से एक है और कुछ असहमत हो सकते हैं होगा। लेकिन मैं हमेशा कहूंगा। एक वर्ग को एक काम करना चाहिए। बात या तो संसाधन प्रबंधन या व्यापार तर्क है। दो लीडों को बहुत अप्रत्याशित जटिलताओं का संयोजन।

+0

धन्यवाद! विशेष रूप से पिछले दो प्रश्नोत्तरों की सराहना करते हैं। मैं उस चरण में हूं जहां मुझे लगता है कि मैं अब नौसिखिया नहीं हूं लेकिन मुझे उस तरह का उच्च स्तर, डिज़ाइन पसंद/दर्शन अंतर्दृष्टि है जो अनुभव के साथ आता है। चीयर्स। – MTLPhil

1

मैं कहूंगा कि एक हैंडल एक स्मार्ट सूचक से अधिक सामान्य अवधारणा है।

उदाहरण के लिए, फ़ाइल हैंडल पर विचार करें। एक फ़ाइल हैंडल एक खुली फ़ाइल का प्रतिनिधित्व करने वाली डेटा संरचना के लिए एक स्मार्ट सूचक हो सकता है, लेकिन क्लाइंट वास्तव में इसे पॉइंटर का इलाज नहीं करता है, बल्कि वे सिर्फ एपीआई को हैंडल पास करते हैं।

तो, हाँ, मैंने कई अवसरों पर अपनी खुद की हैंडल कक्षाएं लिखी हैं।

+0

मुझे लगता है कि आप जिस बिंदु को पार करने की कोशिश कर रहे हैं वह यह है कि एक हैंडल एक * अपारदर्शी * सूचक (और स्मार्ट हो सकता है या नहीं, आमतौर पर वास्तव में नहीं है)। –

+0

@ बेन, हाँ यह कहने का एक अच्छा तरीका है। अगर आपको लगता है कि इसे इसकी जरूरत है, तो संपादित करने के लिए स्वतंत्र महसूस करें। – djna

2

यदि आप थोड़ा सा रूपक सी ++ माफ कर देंगे, तो रिश्ते कुछ ऐसा है: class smart_pointer : public handle;। एक स्मार्ट सूचक एक हैंडल है जो हैंडल के बीच इंटरफ़ेस की विशिष्ट (पॉइंटर-जैसी) शैली प्रदान करता है और जो भी इसे संभाला जाता है। एक हैंडल जो स्मार्ट पॉइंटर नहीं है, आमतौर पर समान ऑपरेशन (कम से कम अस्पष्ट) होता है, लेकिन उनका इंटरफ़ेस पूरी तरह अलग हो सकता है।

किसी बिंदु पर, किसी को स्पष्ट रूप से स्मार्ट पॉइंटर क्लास (एसएस) लिखना होगा। साथ ही, यह हल्के ढंग से करने के लिए कुछ नहीं है। जब तक आप एक अत्यंत सटीक विनिर्देश है, तो आप शायद कम से कम कुछ विवरण गलत मिल जाएगा - और कहा कि "बेहद सटीक विनिर्देश" केवल 50:50 के बारे में करने के लिए बाधाओं को कम कर देता ...

OTOH, यह अभी भी है एक स्मार्ट सूचक डिजाइन करने के रूप में लगभग उतना बुरा नहीं है। यह चरम में मुश्किल हो जाता है। एक स्पष्ट उदाहरण के लिए, auto_ptr को मानकीकरण के दौरान कई बार डिजाइन और पुन: डिज़ाइन किया गया था, लेकिन यह अभी भी वास्तविक जीवन में अपेक्षाकृत कम उपयोग देखता है, और इसे पहले से ही C++ 0x में हटा दिया जा रहा है (std::unique_ptr द्वारा प्रतिस्थापित किया गया है, जो कि उत्पाद है एक बहुत काम, बहस, और प्रयोग और परीक्षण की कोई छोटी राशि नहीं)।

+0

मैं हमेशा कुछ रूपक सी ++ के लिए नीचे हूं :) – MTLPhil

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