2012-02-15 10 views
7

instantiating जब मैं सी में एक वर्ग का दृष्टांत करना चाहते ++ मैं आमतौर पर इस तरह सेसी जब

Book bk = new Book(); 
जाना

मेरे प्रोफेसर इस

Book &bk = *new Book(); 

वह केवल मुझे बताया कि हाल ही में किया था वह तीर (उदाहरण के लिए bk-> getTitle();) के बजाय डॉट (उदाहरण के लिए bk.getTitle();) ऑपरेटर का उपयोग करने में सक्षम होने के लिए एक संदर्भ का उपयोग करेगा। मैं कोड के इस हिस्से को समझता हूं लेकिन जब आप * ऑपरेटर का उपयोग नए संयोजन में करते हैं तो क्या होता है?

अग्रिम धन्यवाद

पूर्ण उदाहरण कोड पाया जा सकता है here यह मुख्य कार्य

+7

तो आपके प्रोफेसर ने आपको दिखाया कि कैसे स्मृति को रिसाव करना है, बढ़िया। – ildjarn

+2

यदि आपका प्रोफेसर उस कोड का उपयोग किसी अन्य चीज़ के उदाहरण के अलावा करता है जो आपको वास्तव में नहीं करना चाहिए, तो आपको एक नया प्रोफेसर मिलना चाहिए। –

+0

शायद आपके प्रोफेसर ने कहा, 'कॉन्स बुक और बीके = बुक(); '। यदि ऐसा नहीं है, तो मैं ईमानदारी से समझ नहीं पा रहा हूं कि आपके प्रोफेसर का क्या अर्थ है। – Mahesh

उत्तर

15

में arraystack है यह:

Book &bk = *new Book(); 

यह करने के लिए काफी बराबर है:

Book *p = new Book(); // Pointer to new book 
Book &bk = *p; // Reference to that book 

लेकिन एक महत्वपूर्ण अंतर है; मूल कोड में, आपके पास कोई पॉइंटर नहीं है जिसका उपयोग आप delete पर गतिशील रूप से आवंटित ऑब्जेक्ट पर कर सकते हैं जब आप इसके साथ काम करते हैं, तो आपने प्रभावी ढंग से मेमोरी लीक बनाया है।

बेशक

, तो आप ऐसा कर सकते हैं:

delete &bk; 

लेकिन वह है अत्यंत गैर मुहावरेदार सी ++, और बहुत बाद में समस्याएं पैदा होने की संभावना।

संक्षेप में, इस तरह के कोड लिखने के लिए बिल्कुल कोई अच्छा कारण नहीं है, इसलिए इसे न करें। इनमें से कोई भी ठीक है:

Book bk; 
Book bk = Book(); 
+0

धन्यवाद, मुझे लगता है कि मैं इसका उपयोग नहीं करूंगा। वर्ग सी ++ के बारे में डिजाइन पैटर्न के बारे में अधिक है, इसलिए मैं इस प्रोग्रामिंग शैली को अनदेखा कर दूंगा और इसे अपना रास्ता दूंगा। – tim

+1

आपने निश्चित रूप से मेमोरी रिसाव नहीं बनाया है, मुझे लगता है कि यह एक विशाल ओवरस्टेटमेंट –

+0

@ सेठ है: मूल कोड में वास्तव में रिसाव है ... आपका क्या मतलब है? – ildjarn

0

मुझे एक ऐसी स्थिति मिली है जो मुझे उस वाक्यविन्यास के बारे में सोचने दे। Base कक्षा में एक स्मार्ट पॉइंटर पर विचार करें और उसे व्युत्पन्न कक्षा में पॉइंटर रखना होगा और आप निर्माण के बाद व्युत्पन्न कक्षा की कुछ गैर-आभासी चीजों तक पहुंच बनाना चाहते हैं। में इस तरह इस मामले में कुछ कानूनी है और इतना बुरा नहीं हो सकता है:

Derived & d = * new Derived(); 

d.d_method(..whatever..); 
d.d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(&d); 

अंत में मैं अभी भी अजीब ऐम्परसेंड लिए छोटे तीर को प्राथमिकता:

Derived d = new Derived(); 

d->d_method(..whatever..); 
d->d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(d); 

लेकिन मुझे लगता है इस में एक मामला है कि केवल स्वाद का मामला, खासकर अगर आप लगातार संख्या में तरीकों तक पहुंचते हैं।

अन्य चीजें जो लीक या delete &d; का नेतृत्व करती हैं, वे केवल बुरी, बुरी, बुरी हैं।