2012-03-25 16 views
11

मेरे पास एक वस्तु है जिसे स्वयं को नष्ट करने की आवश्यकता है।क्या कोई वस्तु स्वयं को नष्ट कर सकती है?

  • क्या यह किया जा सकता है?

  • उदाहरण गलत है?

    void Pawn::specialMoves(Coordinate const& from, Coordinate const& to, int passant) 
    { 
        /*...*/ 
        m_board->replace(to, new Queen(m_colour));//replace pawn by queen 
    } 
    
    void Board::replace(Coordinate const &to, Piece* newPiece) 
    { 
        delete tile[to.x()][to.y()]; 
        tile[to.x()][to.y()] = newPiece; 
    } 
    
+4

क्या वस्तु यहां खुद को नष्ट कर रही है?एफटीआर, खुद को नष्ट करना या तो इसे हटा देगा; या 'यह-> ~ टी();' ('टी 'के प्रकार के साथ)। दोनों मान्य हैं लेकिन सही ढंग से उपयोग करने के लिए बहुत सारी देखभाल की आवश्यकता है। –

+0

मुझे आपके उदाहरण में खुद को नष्ट करने वाला कुछ भी नहीं दिख रहा है। –

+1

Pawn खुद को हटा देता है। मैं कल्पना करता हूं कि एक बार 'm_board-> प्रतिस्थापित करें (नई रानी (m_colour));' फ़ंक्शन शून्य पॉर्न कहा जाता है :: specialMoves (...) ' – danjjl

उत्तर

25

हाँ, यह एक सदस्य समारोह अंदर से delete this कॉल करने के लिए कानूनी है। लेकिन बहुत ऐसा करने का शायद ही कोई अच्छा कारण है (विशेष रूप से यदि आप idiomatic C++ लिख रहे हैं जहां अधिकांश मेमोरी-प्रबंधन कार्यों को कंटेनर, स्मार्ट पॉइंटर्स इत्यादि में सौंप दिया जाना चाहिए)।

  • आत्महत्या वस्तु के माध्यम से new (नहीं new[]) गतिशील रूप से आवंटित किया गया है चाहिए:

    और तुम बहुत सावधान रहने की जरूरत है।

  • एक बार किसी ऑब्जेक्ट ने आत्महत्या करने के बाद, यह अपने अस्तित्व पर निर्भर कुछ भी करने के लिए अपरिभाषित व्यवहार है (यह अब अपने स्वयं के सदस्य चर का उपयोग नहीं कर सकता है, अपने स्वयं के आभासी कार्यों को कॉल कर सकता है)।
+4

+1 ने कभी भी 'नया [] 'नहीं माना था। – hmjd

+1

यहां कुछ देर हो चुकी है, लेकिन यह सुनिश्चित करने के लिए कि 'ऑब्जेक्ट' के माध्यम से ऑब्जेक्ट आवंटित नहीं किया गया था, क्या यह 'ऑपरेटर नया []() = delete' लिखने के लिए पर्याप्त होगा? – iFreilicht

+0

मुझे लगता है कि 'std' कंटेनर' हटाने की विधियों को कॉल करना उतना ही ठीक है, अमीरात? –

2

हां, यह काम करना चाहिए। यहां तक ​​कि delete this; की अनुमति है।

लेकिन specialMoves() पर कॉल करने वाला कोड एक बुरा आश्चर्य के लिए हो सकता है।

0

जब तक आप ऑब्जेक्ट को नष्ट करने के लिए कॉल के बाद सदस्य चर या this पॉइंटर तक नहीं पहुंचते हैं, तो आपको ठीक होना चाहिए। चूंकि ऐसा नहीं लगता है कि आप इन चीजों में से कोई भी कर रहे हैं, उदाहरण काम करना चाहिए।

1

प्रश्न: क्या कोई वस्तु स्वयं को नष्ट कर सकती है?

ए: निश्चित रूप से। "हटाएँ इस" COM/ActiveX

में एक लोकप्रिय मुहावरा

जहाँ तक अपने एल्गोरिथ्म के रूप में है, मेरा सुझाव चाहते हैं:

  • एक "बोर्ड" वस्तु "टाइल" है। शायद सिर्फ एक साधारण 2-डी सरणी।

  • आप n "टुकड़े"

  • कुछ नियंत्रक (शायद एक "खेल" वस्तु), एक "टाइल" के संबंध में एक "टुकड़ा" चाल के साथ शुरू।

  • प्रत्येक "टाइल" 0 या 1 "टुकड़े"

मुझे यकीन है कि मैं बनाने या एक प्रति-चाल के आधार पर कुछ भी नष्ट करने के लिए किसी भी कारण देख नहीं कर रहा हूँ के लिए एक संदर्भ है।

IMHO ...

+2

मुझे लगता है कि मामला तब होता है जब पंजा बोर्ड के विपरीत छोर तक पहुंच जाता है, इसे रानी द्वारा प्रतिस्थापित किया जाता है। –

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