2012-01-31 12 views
11

मैं इस (सरलीकृत) की तरह वर्ग है मान लीजिए:यह डिजाइन पैटर्न क्या है? इसका इस्तेमाल कैसे करें?

class Foo_p; 
class Foo 
{ 
private: 
    Foo_p *p; 
public: 
    Foo(); 
    /* methods, etc... */ 
}; 

इस वर्ग के एक API का एक हिस्सा है। Foo_p कक्षा के सभी निजी हिस्सों में है, जो कक्षा में स्वयं को सामान्य रूप से घोषित नहीं किया गया है, बल्कि एक अलग अग्रेषित घोषित वर्ग में है जो केवल अंतर्निहित कार्यान्वयन द्वारा उपयोग किया जाता है जो बाहर दिखाई नहीं देता है।

मैंने इस परियोजना को दो परियोजनाओं में उपयोग किया है, क्या इसके लिए कोई नाम है?

इसके अलावा, मैं इसे सही तरीके से कैसे उपयोग करूं (उदा। अपवाद सुरक्षा, आदि)? वास्तविक कार्यान्वयन कहां जाना चाहिए? क्लास फू में, सामान्य रूप से, डेटा के संग्रहण के लिए केवल Foo_p का उपयोग करके, या Foo_p कक्षा में फू के साथ केवल एक आवरण होता है?

उत्तर

8

यह ज्ञात है PIMPL। निजी/सूचक-से-निजी कार्यान्वयन। कक्षा, Foo_p, आपकी कक्षा को निजी रूप से कार्यान्वित किया गया है और इसे पॉइंटर के माध्यम से एक्सेस किया गया है ताकि ग्राहकों को सच्ची कक्षा प्रदर्शित करने के बजाय, उन्हें केवल सार्वजनिक इंटरफ़ेस को देखने के लिए चुना गया हो। यह अनिवार्य रूप से protected और private सदस्यों में कार्यान्वयन विस्तार के निहित हेडर से दूर है।

मुझे इसे वीसी ++ में अनावश्यक पाया गया है - यह कोड पूर्ण होने को तोड़ देता है। यह उपयोगी है अगर आप अपने कार्यान्वयन के बारे में बहुत यकीन रखते हैं और शीर्षलेख में प्रदर्शित होने पर private और protected सदस्यों को नहीं चाहते हैं।

मैं, वर्ग Foo के लिए सीपीपी फ़ाइल में वर्ग Foo_p के वास्तविक क्रियान्वयन डाल हालांकि इस कोड: पूर्ण करने तोड़ने का कारण हो सकता है, कम से कम मैं कक्षा के जोखिम को चलाने के लिए reused किया जा रहा नहीं है अपने हेडर को शामिल करके।

+0

मत दोनों हेडर और सामान्य सुरक्षा का स्तर (सार्वजनिक/निजी) "अनिवार्य रूप से कार्यान्वयन को छिपाने"? –

+0

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

+0

@MatthewFlaschen: हाँ, लेकिन केवल इस अर्थ में कि आप इसे एक्सेस नहीं कर सकते हैं, लेकिन कोड को देखते समय भी आप इसे * देख सकते हैं। – bitmask

8

है कि pimpl मुहावरा

+0

लिंक के लिए धन्यवाद! – kralyk

+0

लिंक मर चुके हैं :( – pmb

+1

@pmb संकेत के लिए धन्यवाद। सभी तीन लिंक फिक्स्ड। _o.O permalinks ... जब उन्होंने काम किया, तो वे बहुत अच्छे थे :( – sehe

2

यह एक डी-पॉइंटर है जो एक प्रकार का अपारदर्शी सूचक है। पीआईएमपीएल मुहावरे के समान।

सी ++ कक्षा घोषणाओं में आमतौर पर उपयोग किए जाने वाले एक प्रकार का अपारदर्शी सूचक डी-पॉइंटर है। डी-पॉइंटर वर्ग का एकमात्र निजी डेटा सदस्य है और एक संरचना के उदाहरण को इंगित करता है। ट्रॉल्टेक के अर्ंट गुलबब्रांसेन द्वारा नामित, यह विधि डी-पॉइंटर को छोड़कर, निजी डेटा सदस्यों को छोड़ने के लिए कक्षा घोषणाओं को अनुमति देती है।[6] नतीजा यह है कि कक्षा के अधिक कार्यान्वयन को देखने से छुपाया गया है, जो निजी संरचना में नए डेटा सदस्यों को जोड़ना बाइनरी संगतता को प्रभावित नहीं करता है, और यह है कि हेडर फ़ाइल घोषणा है जिसमें केवल # कक्षा कार्यान्वयन के लिए आवश्यक अन्य फ़ाइलों को शामिल करें, इसके कार्यान्वयन के बजाए। एक पक्ष लाभ के रूप में, संकलन तेज़ होते हैं क्योंकि हेडर फ़ाइल कम बदलती है। क्यूटी और केडीई पुस्तकालयों में डी-पॉइंटर का भारी उपयोग किया जाता है।

https://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B

+0

अपने स्रोतों को उद्धृत करें। –

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