2009-03-17 12 views
5

मैं एक वर्ग है कि एक सार्वजनिक विधि के अंदर एक वस्तु बनाता है। वस्तु निजी है और कक्षा के उपयोगकर्ताओं के लिए दृश्यमान नहीं है। इस विधि तो एक ही कक्षा के अंदर अन्य निजी तरीकों कॉल करता है और एक पैरामीटर के रूप में बनाया वस्तु पारित:एक क्लास के भीतर तर्क के रूप में एक स्मार्ट सूचक पासिंग: scoped_ptr या shared_ptr?

class Foo { 
    ... 
}; 

class A { 
    private: 
     typedef scoped_ptr<Foo> FooPtr; 

     void privateMethod1(FooPtr fooObj); 

    public: 
     void showSomethingOnTheScreen() { 
      FooPtr fooObj(new Foo); 
      privateMethod1(fooObj); 
     }; 
}; 

मेरा मानना ​​है कि इस मामले में सही स्मार्ट सूचक एक scoped_ptr होगा, हालांकि, मैं नहीं कर सकता इस वजह scoped_ptr वर्ग गैर copyable अगर इस तरह से इस्तेमाल किया है, इसलिए मैं इस तरह के तरीकों बनाना चाहिए:

void privateMethod1(FooPtr& fooObj); 

privateMethod1 वस्तु की दुकान नहीं है, न तो इसके बारे में संदर्भ रहता है। बस वर्ग फू से डेटा प्राप्त करता है।

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

सब के बाद, मैं अभी भी scoped_ptr के वास्तविक उपयोग के बारे में संदेह में हूँ।

+1

मैं पुस्तकालय के बारे में उत्सुक हूं कि 'स्टैक पर वस्तुओं की अनुमति नहीं देता है'। क्या लाइब्रेरी के अंदर एक कारखाने के साथ ढेर पर आवंटित वस्तुएं हैं? क्या लाइब्रेरी पॉइंटर का स्वामित्व लेती है और इसे हटा देती है?आवंटित ऑब्जेक्ट्स का उपयोग क्यों नहीं कर सकते हैं इसके कारण क्या हैं? –

उत्तर

1

उपयोग यहाँ सरल std :: auto_ptr आप ढेर पर वस्तुओं निर्माण नहीं कर सकता। और यह आपके निजी समारोह के लिए बेहतर है केवल कच्चे सूचक को स्वीकार करें।

रियल उपयोग है कि आप हर संभव अपवाद को पकड़ने के लिए की जरूरत नहीं है और मैनुअल हटाने करते हैं।

वास्तव में यदि आपके वस्तु है सुनिश्चित करें कि आप

void privateMethod1(const Foo& fooObj); 

उपयोग करने के लिए बेहतर चाहते के लिए वस्तु और आपके एपीआई वापसी वस्तु संशोधित नहीं करता है और वहाँ के रूप में

privateMethod1(*fooObj.get()); 
+0

वह अंत ठीक से scoped_ptr जैसा ही है, बस यह आपको संदर्भ के रूप में अपने विधि पैरामीटर घोषित करने के लिए मजबूर नहीं करता है। लेकिन यदि आप नहीं करते हैं, तो यह आश्चर्यजनक तरीकों से तोड़ देगा (fooObj निजी मोड 1 रिटर्न के बाद एक नल पॉइंटर होगा, भले ही आप इसके साथ और अधिक सामान लेना चाहते हों)। – sth

+0

पाठ्यक्रम के दौरान sth के साथ सहमत हो गया। auto_ptr का उपयोग क्यों करें यदि scoped_ptr स्पष्ट रूप से बेहतर विकल्प है? स्वामित्व का हस्तांतरण इरादा नहीं था। –

+0

दोस्तों, मुझे अपनी परियोजना पर बढ़ावा नहीं मिला है। इसलिए मैंने इस तरह के एसएलएल समाधान का प्रस्ताव दिया। आप 'स्वामित्व का हस्तांतरण' कहां देखते हैं? –

1

मैं वस्तु पारित मीटर टिप्पणी के बारे में संदिग्ध "यह एक पुस्तकालय है कि ढेर पर वस्तुओं, वे ढेर पर होना चाहिए की अनुमति नहीं है का उपयोग करता है।"

क्यों? इसका आम तौर पर मतलब है कि उन्हें किसी विशेष तरीके से हटा दिया जाना चाहिए - इसलिए शायद इनमें से कोई भी समाधान काम नहीं करेगा।

void privateMethod1(Foo *fooObj); 

void showSomethingOnTheScreen() { 
    scoped_ptr<Foo> fooObj(new Foo); 
    privateMethod1(fooObj.get()); 
}; 
+0

@ एरिकविकर जिस कंपाइलर का उपयोग कर रहे हैं वह है बोर्लैंड सी ++ और जिस लाइब्रेरी का हम उपयोग कर रहे हैं वो वीसीएल जीयूआई लाइब्रेरी है जिसे सी ++ के साथ बंडल किया गया है। यह जल्द ही बदल जाएगा, लेकिन मुझे अभी इसके साथ रहना होगा। किसी कारण से, वीसीएल को हीप पर आवंटित किया जाना चाहिए, मुझे कोई वास्तविक विचार नहीं है। –

+0

शायद इसका अर्थ यह है कि लाइब्रेरी में फैक्ट्री विधियां हैं जो पॉइंटर्स को बनाए गए ऑब्जेक्ट्स लौटाती हैं और उपयोगकर्ता को स्वामित्व पास करती हैं। –

+0

क्या आप वाकई वस्तुओं को हटाने की जरूरत है? मैंने वीसीएल का कभी भी उपयोग नहीं किया है, लेकिन मुझे एक अस्पष्ट धारणा मिली है कि जब उनके माता-पिता हटा दिए जाते हैं तो यह स्वचालित रूप से घटकों को हटा देता है। –

3

आगे संभावना स्मृति प्रबंधन में आसानी के लिए एक static_ptr के रूप में वस्तु बनाने के लिए, लेकिन सिर्फ अन्य निजी तरीकों के लिए कच्चे सूचक पारित है कच्चे सूचक (या संदर्भ) को निजी विधि 1, उदाहरण के लिए

scoped_ptr <Foo> fooObj (नया Foo);
privateMethod1 (fooObj.get());

3

मैं showSomethingOnTheScreen अंदर scoped_ptr का प्रयोग करेंगे, लेकिन एक पारित:

+0

यह मेरा असली अनुमान था, लेकिन क्या इस अभ्यास की सिफारिश की गई है? अगर ऐसा है तो मैं यही करूँगा –

0

उस मामले में, आप केवल आवंटन तंत्र को बदलने के लिए।
ढेर पर वस्तु बनाएं, लेकिन निजी तरीकों के संदर्भ के रूप में वस्तु गुजरती हैं।

class A { 
    private: 
     void privateMethod1(Foo& fooObj); 

    public: 
     void showSomethingOnTheScreen() { 
      scoped_ptr<Foo> fooObj(new Foo); 
      privateMethod1(*(fooObj.get())); 
     }; 
}; 
संबंधित मुद्दे