c++ - Polymorphism and shared_ptr member -
परीक्षण बहुरूपता & amp; आभासी कार्य और amp; shared_ptr, मैं निम्न न्यूनतम उदाहरण द्वारा वर्णित स्थिति को समझने की कोशिश कर रहा हूं।
class B {सार्वजनिक: // वर्ग बी वर्चुअल शून्य से परिभाषित कोई विधि () {// एक बर्गर बनाएं}; }; वर्ग सी: सार्वजनिक बी {सार्वजनिक: // परिभाषा वर्ग सी शून्य someBMethod () {// एक पिज्जा बनाओ}; }; वर्ग ए {सार्वजनिक: ए (बी एंड ए बी): सदस्य (मानक :: मेक-शेरेड & lt; बी & gt; (एएबीबी)) {}; std :: shared_ptr & lt; p & gt; सदस्य; }; अब, मुख्य में हम हो सकते हैं
int main () {सी SomeC; ए ए ए (एसीसी); A.Member- & gt; someBMethod (); // someBMethod को बी से निष्पादित किया जा रहा है। }; जब तक मैं अपने वास्तविक कोड से कुछ गलती को न्यूनतम उदाहरण में शामिल नहीं करता, मुझे लगता है कि SomeC को B , या कम से कम someBimethod से बी को अंतिम पंक्ति में बुलाया जा रहा है प्रश्न: सदस्य को इस तरह से प्रारंभ करने का सही तरीका क्या होना चाहिए कि विधि someBMethod से सी कहलाता है?
मुझे लगता है कि someC एक B में कटा हुआ हो रहा है, यह वास्तव में क्या हो रहा है make_shared एक विशिष्ट प्रकार का एक नया ऑब्जेक्ट बनाता है, उसके तर्क को एक उपयुक्त कन्स्ट्रक्टर में अग्रेषित करता है। तो यह एक नया B बनाता है, B SomeC के सब-ऑब्जेक्ट की प्रतिलिपि बनाने के लिए इसकी कॉपी-कन्स्ट्रक्टर का उपयोग करके आरंभिक। इस तरह से someBimethod से C को कॉल किया जाता है? सदस्य को प्रारंभ करने का सही तरीका क्या होना चाहिए? > यह मुश्किल है: सी साझा नहीं है, लेकिन सदस्य है, और आप इसे दोनों तरीकों से नहीं कर सकते यह संभवत: सर्वश्रेष्ठ है यदि आपको उपयोगकर्ता को साझा पॉइंटर में पारित करने की आवश्यकता होती है, तो इस तथ्य को उजागर करें कि इसे इस वर्ग के साथ साझा किया जाना है: A (std :: shared_ptr & lt; B & gt; SomeB): सदस्य (SomeB) {} यदि आप वास्तव में इसे गैर-साझा ऑब्जेक्ट का उपयोग करने की अनुमति देना चाहते हैं, तो आप एक डमी डिलीटर के साथ एक साझा पॉइंटर बना सकते हैं, इसलिए यह कोशिश नहीं करता शेयर स्वामित्व:
ए (बी एंड ए बी): सदस्य (मानक :: साझा एपीटीआर & lt; B & gt; (& amp; SomeB, [] (बी *) {})} {} लेकिन सावधान रहें कि आप यह सुनिश्चित करने के लिए जिम्मेदार हैं कि C को A के बाद तक नष्ट नहीं किया गया है, और इसकी किसी भी प्रति की आवश्यकता नहीं है । आपने एक "मालिक" साझा सूचक की सुरक्षा को खो दिया है। आप जो भी करते हैं, बस & amp; SomeB से एक साझा सूचक नहीं बनाते हैं। डिफ़ॉल्ट डेलिटर इसे हटाने का प्रयास करेगा, जो कि एक त्रुटि है क्योंकि यह गतिशील रूप से नहीं बनाया गया था।
Comments
Post a Comment