2016-01-14 2 views
5

चलो कक्षा Test और एक वर्ग AnotherClass है। दोनों QObject से निकला।अपने विनाशक को परिभाषित करना हालांकि कक्षा QObject से निकली है?

Test.h:

class Test : public QObject 
{ 
Q_OBJECT 

public: 
    Test(QObject* parent); 
    ~Test(); 

private: 
    AnotherClass* other; 
}; 

class AnotherClass : public QObject 
{ 
Q_OBJECT 

public: 
    AnotherClass(QObject* parent); 
    ~AnotherClass(); 
}; 

Test.cpp: जब Test -instance नष्ट हो जाता है क्योंकि Testother के माता पिता, सही है

Test::Test(QObject* parent) : QObject(parent) 
{ 
    other = new AnotherClass(this); 
} 

Test::~Test() 
{ 
    delete other; 
} 

other स्वचालित रूप से नष्ट कर दिया जाना चाहिए?

  • अब मैं ~Test() में other अपने आप से हटा देना चाहिए या यह एक अपरिभाषित चरण में कार्यक्रम छोड़ने क्योंकि यह दो बार एक ही वस्तु को नष्ट करने की कोशिश करता है?
  • यहां सही दृष्टिकोण क्या है?
+1

आपके विनाशक आभासी हो। – KoVadim

+4

@ कोवाडिम - क्योंकि क्यूओब्जेक्ट में आभासी विनाशक है, इसलिए उनके विनाशक पहले से ही आभासी हैं .. – Roddy

उत्तर

10

QObjects ऑब्जेक्ट पेड़ में स्वयं को व्यवस्थित करें। जब आप QObject माता-पिता के रूप में किसी अन्य ऑब्जेक्ट के साथ बनाते हैं, तो ऑब्जेक्ट स्वचालित रूप से माता-पिता के बच्चों() सूची में स्वयं को जोड़ देगा। माता-पिता वस्तु का स्वामित्व लेता है; यानी, यह अपने बच्चों को अपने विनाशक में स्वचालित रूप से हटा देगा। अधिक जानकारी के लिए Object Trees & Ownership देखें।

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

हालांकि, इस मामले में विनाशक में स्पष्ट हटाने से डबल विलोपन नहीं होता है क्योंकि यह अभिभावक के बच्चों() सूची से अनियंत्रण का कारण बनता है।

4

इस सच के बावजूद आप नाशक virtual करना है से, क्यूटी प्रलेखन कहते हैं:

QObject रों ढेर पर बनाए जाते हैं (यानी, new के साथ बनाया), एक पेड़ कर सकते हैं किसी भी क्रम में उनके द्वारा निर्मित किया जाना चाहिए, और बाद में, में वस्तुओं को किसी भी क्रम में नष्ट किया जा सकता है। जब पेड़ पेड़ में हटा दिया जाता है, यदि ऑब्जेक्ट में माता-पिता हैं, तो विनाशक स्वचालित रूप से ऑब्जेक्ट को अपने माता-पिता से हटा देता है। अगर ऑब्जेक्ट में बच्चे हैं, तो विनाशक स्वचालित रूप से प्रत्येक बच्चे को हटा देता है। विनाश के आदेश के बावजूद QObject हटा दिया गया है।

तो तुम other वर्ग स्पष्ट रूप delete सकता है, लेकिन आप की जरूरत नहीं है। या तो दृष्टिकोण को delete एस के बिना काम करना चाहिए।

वैसे, आप AnotherClass को पॉइंटर के बजाय Test का एक साधारण सदस्य भी बना सकते हैं।

+1

आपको इसे एक साधारण सदस्य नहीं बनाना चाहिए, क्योंकि QObjects कॉपी करने योग्य/.ignignable नहीं हैं। – Roddy

+0

क्षमा करें, आभासी विनाशक। यह पहले से ही इंगित किया गया है, https://stackoverflow.com/questions/461203/when-to-use-virtual-destructors देखें – hfhc2

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