2010-11-03 12 views
6
class ClassA 
{ 
public: 
    ClassA(ClassB *p) b(p){} 
    ~ClassA(){delete b;} 
    ClassB *b; 
}; 

क्या इस तरह का डिज़ाइन अच्छा है?क्या हमें एक ऐसे पॉइंटर को हटा देना चाहिए जो हमारे द्वारा नया/मॉलोक नहीं है?

+0

कभी भी स्थिति को छोड़कर 'क्लासए' इस 'कक्षाबी' उदाहरण पर स्वामित्व नहीं ले रहा है, जो '* पी' सूचक – erjot

उत्तर

0

आम तौर पर यह एक बुरा विचार है। अक्सर आप नहीं जानते कि कक्षाबी की वस्तु कैसे बनाई गई थी। यह नए [] ऑपरेटर के साथ बनाए गए सरणी के तत्व के लिए एक सूचक हो सकता है, या इसे अलग-अलग डीएल से सौंप दिया जा सकता है जो कस्टम मेमोरी आवंटक का उपयोग करता है। उन मामलों में ऑपरेटर का उपयोग करके इस पॉइंटर को हटाने के लिए एक गंभीर त्रुटि होगी।

+0

और आमतौर पर, इस एपीआई के उपयोगकर्ता बस क्लासबी * पैरामीटर, यह नए द्वारा बनाया जा सकता है, या केवल क्लासबी तत्व का पता। बाद के मामले में, यह डबल मुक्त हो जाएगा। – qiuxiafei

9

उत्तर है यह पर निर्भर करता है। आपको स्पष्ट करना होगा कि ऑब्जेक्ट जीवनकाल के लिए कौन जिम्मेदार है।

ClassA में उपयोगकर्ता द्वारा परिभाषित प्रति-निर्माता और असाइनमेंट ऑपरेटर की कमी है और इससे अपरिभाषित व्यवहार हो सकता है। उदाहरण के लिए:

ClassA object1(new ClassB()); //object1 takes ownership of the object 
ClassA object2(object1); //object2 takes ownership of the same object 
// now first object2 is destroyed and deletes the object 
// then object1 is destroyed and double-delete happens 

तो आपका उदाहरण संभवतः बहुत अच्छा नहीं है।

0

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

1

आमतौर पर इस तरह की स्थिति में पॉइंटर्स का उपयोग खराब डिजाइन है। इस तरह की स्थिति में स्मार्ट पॉइंटर्स आपके सबसे अच्छे दोस्त हैं। हालांकि अगर आपको पॉइंटर्स का उपयोग करना है तो बस इसे किसी भी तरीके से चुनें और ध्यान से इसे

1

इस विशेष रूप से कुछ भी गलत नहीं है - तकनीकी रूप से आपने क्लासबी के स्वामित्व को क्लासए उदाहरण के बजाय स्वामित्व पारित किया है (यानी कक्षा क्लासए की आवश्यकता होने से पहले उदाहरण मौजूद है, लेकिन क्लासए बनने के बाद यह क्लासबी का मालिक बन जाता है)।

चाहे यह एक अच्छा डिज़ाइन है, उस संदर्भ पर निर्भर करता है जिसमें यह लागू होता है। उदाहरण के लिए, क्या यह समझ में आता है कि कक्षा ए कक्षा के स्वामित्व लेता है? क्या आप एक "सादे पुराने" सूचक के बजाय एक स्मार्ट सूचक का उपयोग कर रहे हैं?

2

तुम्हारा मतलब क्या:

class ClassA { 
    ClassB *b; 
public: 
    ClassA(ClassB * p) {b = p;} 
    ~ClassA() {delete b;} 
}; 

यह अच्छा डिजाइन नहीं है। जो बनाता है वह हटाना चाहिए।

+0

द्वारा दिया गया है, यह मेरा नियम भी है –

1

के रूप में अन्य लोगों ने कहा, यह स्मार्ट संकेत का उपयोग करके या एक ही स्तर पर एक वस्तु को हटाने यह बनाया गया था ... या संकेत का उपयोग कर बिल्कुल नहीं द्वारा इस स्थिति से बचने के लिए बेहतर है।

एक ही समय में, मैं यह जरूरी बुरा डिजाइन है दस्तावेज में यह ClassA उपयोगकर्ताओं को स्पष्ट, वस्तु स्वामित्व हस्तांतरण करने के लिए जब तक आप नहीं कह सकते हैं कि। जब कार्य करता है जो एक वस्तु के लिए सूचक ले सकते हैं और इसे अपने स्वयं के उपयोग के लिए कॉपी-निर्माण लेखन मैं एक ऐसी ही स्थिति का सामना करना पड़ा है। कहाँ की जरूरत है, मैं "पैरामीटर प्रतिलिपि अर्थ विज्ञान" या कुछ और जो फोन करने वाले "तुम क्या आप इस उद्देश्य के साथ चाहते हैं के बाद मैं ... मैं अपने खुद के प्रति है वापसी कर सकते हैं" कहता है के साथ इन कार्यों पर टिप्पणी करते हैं।

आप कच्चे संकेत का उपयोग कर रहे हैं, मैं यह महत्वपूर्ण फोन करने वाले ठेके के इन प्रकार की स्थापना के लिए विचार करना चाहते हैं।

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

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