2010-03-02 13 views
17

अगर मैं निम्नलिखित घोषणा की है:क्या मुझे सी ++ कक्षा के स्ट्रिंग सदस्यों को हटा देना चाहिए?

#include <iostream> 
#include <string> 

class DEMData 
{ 
private: 
    int bitFldPos; 
    int bytFldPos; 
    std::string byteOrder; 
    std::string desS; 
    std::string engUnit; 
    std::string oTag; 
    std::string valType; 
    int idx; 
public: 
    DEMData(); 
    DEMData(const DEMData &d); 
    void SetIndex(int idx); 
    int GetIndex() const; 
    void SetValType(const char* valType); 
    const char* GetValType() const; 
    void SetOTag(const char* oTag); 
    const char* GetOTag() const; 
    void SetEngUnit(const char* engUnit); 
    const char* GetEngUnit() const; 
    void SetDesS(const char* desS); 
    const char* GetDesS() const; 
    void SetByteOrder(const char* byteOrder); 
    const char* GetByteOrder() const; 
    void SetBytFldPos(int bytFldPos); 
    int GetBytFldPos() const; 
    void SetBitFldPos(int bitFldPos); 
    int GetBitFldPos() const; 
    friend std::ostream &operator<<(std::ostream &stream, DEMData d); 
    bool operator==(const DEMData &d) const; 
    ~DEMData(); 
}; 

क्या कोड नाशक में होना चाहिए? क्या मुझे std::string फ़ील्ड "हटाएं" चाहिए?

+2

शैली पर एक टिप्पणी: इसके बजाय कार्यों से स्थिरांक चार * '' लौटने की, मैं 'वापस जाने के लिए स्थिरांक std :: स्ट्रिंग और' पसंद करेंगे। यह संभव है जब स्ट्रिंग लौटाई वस्तु का सदस्य है। और इसी तरह इनपुट के लिए, मैं 'const std :: string &' –

+2

पसंद करूंगा क्या आपने प्रश्न पोस्ट करने से पहले इसे आजमाने की भी कोशिश की थी? आप उन तारों को हटा नहीं सकते थे, भले ही आप चाहते थे। –

+1

कभी-कभी आप लोगों को दायरे से बाहर जाने से पहले मानक कंटेनरों पर 'स्पष्ट()' कॉल करने वाले लोगों को देख सकते हैं (इस अर्थ में "हटाना")। यह भी आवश्यक नहीं होगा। – UncleBens

उत्तर

24

आपके विनाशक को केवल उन सदस्यों को नष्ट करना है जिनके लिए आप संसाधन आवंटित करते हैं। तो नहीं, आप तारों को "हटाएं" नहीं करते हैं।

आप संकेत आप के साथ आवंटित हटाना नई

आपका नाशक होने के लिए नहीं है और अधिक से अधिक

~DEMData() 
{ 
} 
+10

वास्तव में आप उस विनाशक को छोड़ सकते हैं। संकलक इसे आपके लिए – pm100

+2

बना देगा और यदि आप इसे आपूर्ति नहीं करते हैं तो संकलक आपके लिए उत्पन्न करेगा। – Torlack

6

नहीं है, std :: स्ट्रिंग सदस्यों ढेर या आप के लिए ढेर पर स्वचालित रूप से आवंटित किए जाते हैं और स्वचालित रूप से साफ कर रहे हैं। तारों को संभालने के लिए आपको अपने विनाशक में कुछ खास करने की ज़रूरत नहीं है।

+1

ढेर पर? केवल तभी 'डेमडाटा' उदाहरण ढेर पर है। –

+1

कड़ाई से बोलते हुए, आप यह नहीं कह सकते कि क्या std :: स्ट्रिंग ऑब्जेक्ट स्वयं ढेर या ढेर पर है क्योंकि आप नहीं जानते कि डीईएमडीटा का निर्माण कैसे किया जा रहा है। निहित स्ट्रिंग ढेर पर होगी जब तक कि std :: स्ट्रिंग का कार्यान्वयन std :: स्ट्रिंग ऑब्जेक्ट का उपयोग छोटे तारों के लिए स्ट्रिंग को स्टोर करने के लिए नहीं करता है। – Torlack

3

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

कंपाइलर आपके लिए पहले उल्लिखित सभी का उत्पादन करता है और डिफ़ॉल्ट रूप से विनाशक केवल सभी सदस्यों के विनाशकों को आमंत्रित करता है (यह उपयोगकर्ता द्वारा परिभाषित विनाशक पूर्ण होने के बाद भी होता है)। स्ट्रिंग का विनाशक वहां से ले जाता है।

+0

मुझे लगता है कि यह स्वीकार्य उत्तर होना चाहिए क्योंकि यह ओपी को परेशान करने वाली "चीज़" का जवाब देता है: > डिफ़ॉल्ट रूप से विनाशक केवल सभी सदस्यों के विनाशकों को आमंत्रित करता है (यह उपयोगकर्ता द्वारा परिभाषित विनाशक पूर्ण होने के बाद भी होता है)। – Opher

5

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

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