abstract class - C++ destructor problem with boost::scoped_ptr -


मेरे पास निम्न कोड के बारे में एक सवाल है:

  #include & lt; iostream & gt; # शामिल करें & lt; boost / scoped_ptr.hpp & gt; कक्षा इंटरफ़ेस {}; वर्ग ए: सार्वजनिक इंटरफेस {सार्वजनिक: ए () {std :: cout & lt; & lt; "ए ()" & lt; & lt; std :: endl; } आभासी ~ ए () {std :: cout & lt; & lt; "~ ए ()" & lt; & lt; std :: endl; }}; इंटरफ़ेस * get_a () {ए * ए = नया ए; वापसी; } Int main () {{std :: cout & lt; & lt; "1" & lt; & lt; std :: endl; को बढ़ावा देने :: scoped_ptr & LT; इंटरफेस & gt; एक्स (get_a ()); Std :: cout & lt; & lt; "2" & lt; & lt; std :: endl; } Std :: cout & lt; & lt; "3" & lt; & lt; std :: endl; }  

यह निम्न आउटपुट बनाता है:

  1 ए () 2 3  

जैसा कि आप देख सकते हैं, यह ए के नाशक को नहीं बुलाता है। एकमात्र तरीका जिसे मैं बुलाया जा रहा है के नाशक को प्राप्त करने के लिए देख रहा हूं, इस तरह इंटरफ़ेस वर्ग के लिए एक नाशक जोड़ना है:

  virtual ~ interface ) {}  

लेकिन मैं वास्तव में अपने इंटरफ़ेस वर्ग में कोई भी कार्यान्वयन से बचना चाहता हूं और virtual ~ interface () = 0; काम नहीं करता (कुछ लिंकर का उत्पादन करता है) ~ इंटरफ़ेस () । के एक गैर-मौजूदा कार्यान्वयन के बारे में शिकायत करने वाले त्रुटियों। तो मेरा सवाल है: नाशक को बुलाया जाने के लिए मुझे क्या करना होगा, लेकिन (यदि संभव है) एक अंतरफलक (केवल सार विधियों) के रूप में इंटरफ़ेस को छोड़ें।

आपको वर्चुअल डिस्ट्रक्टर को परिभाषित करना होगा बेस क्लास, अन्यथा आपको कोई बहुरूपिक व्यवहार नहीं मिलेगा।

और अधिक महत्वपूर्ण बात, आप अन्यथा अपरिभाषित व्यवहार प्राप्त करते हैं; §5.3.5 / 3:

यदि ऑपरैंट के स्थैतिक प्रकार इसकी गतिशील प्रकार से अलग है, तो स्थिर प्रकार प्रचालन के गतिशील प्रकार का एक आधार वर्ग होगा और स्थैतिक प्रकार का वर्चुअल डिस्ट्रक्टर होगा या व्यवहार अपरिभाषित है

जोर मेरा।


मैं सबसे अच्छा यह है कि बहस होगा:

  वर्ग इंटरफ़ेस {सार्वजनिक: आभासी ~ अंतरफलक (शून्य) = 0; }; इनलाइन इंटरफेस :: ~ इंटरफ़ेस (शून्य) {}  

कंपाइलर आसानी से इसे इनलाइन कर सकते हैं, एक समाधान के विपरीत जहां कार्यान्वयन एक स्रोत फ़ाइल में रहता है। (जिसमें से बोलते हुए, यह समाधान आपके पास एक भी जनादेश नहीं करता है।) यह कक्षा को शुद्ध आभासी भी छोड़ देता है।


Comments

Popular posts from this blog

python - rename keys in a dictionary -

lex - Building a lexical Analyzer in Java -

windows - Heroku throws SQLITE3 Read only exception -