2014-09-09 4 views
5

के साथ कन्स्ट्रक्टर ले जाएं मुझे पता है कि यह प्रश्न बहुत ही बुनियादी प्रतीत हो सकता है। लेकिन मुझे संख्या पॉइंटर्स के साथ एक चालक कन्स्ट्रक्टर का कहीं भी उदाहरण नहीं मिल रहा है।कोई पॉइंटर्स

मैं एक वर्ग है कि एक सदिश ऑब्जेक्ट चर रखती है। एक के लिए एक सूचक नहीं है। तो मेरा प्रश्न: क्या इसका मतलब यह है कि मुझे एक चालक कन्स्ट्रक्टर में कोई आवश्यकता नहीं है? या मेरा कार्यान्वयन गलत है और मुझे एक वेक्टर के लिए पॉइंटर का उपयोग करना चाहिए और फिर एक चालक कन्स्ट्रक्टर का उपयोग करना चाहिए?

आप

+2

आपको अभी भी एक चालक कन्स्ट्रक्टर होना चाहिए, क्योंकि 'std :: vector' चलने से लाभ हो सकता है। कंपाइलर से उत्पन्न एक (सदस्यवार चाल) काफी अच्छा होना चाहिए। –

+0

मेरा मानना ​​है कि इसे * कॉपी कन्स्ट्रक्टर * कहा जाता है, नहीं * कन्स्ट्रक्टर * ले जाएं। –

+1

@AlexFarber: यदि कोई सदस्य पॉइंटर्स नहीं है (जैसा कि टीसी द्वारा ऊपर उल्लिखित है) डिफ़ॉल्ट प्रति-निर्माता पर्याप्त है। –

उत्तर

10

धन्यवाद अपने वर्ग (जैसे कि एक वेक्टर के रूप में) चल ऑब्जेक्ट हैं, तो सिर्फ संकलक निहित चाल संचालन उत्पन्न करते हैं। वे प्रत्येक सबोबजेक्ट को ले जाने, सही काम करेंगे।

आप केवल, आप गतिशील तत्व या अन्य अप्रबंधित संसाधन हैंडल करने के लिए कच्चे संकेत से खेल रहे हों, तो अपने स्वयं के बारे में की आवश्यकता होगी अपने आप को। सबसे अच्छा तरीका यह है कि इनमें से प्रत्येक को प्रबंधित करने के लिए एक सही प्रतिलिपि/चलने योग्य वस्तु (जैसे कंटेनर, स्मार्ट पॉइंटर, या अन्य आरएआईआई कक्षा) हो; तो इन्हें लिखकर निर्मित एक जटिल वस्तु निश्चित रूप से सही प्रतिलिपि/चाल semantics होगा।

(जैसा कि टिप्पणियों में उल्लेख किया गया है: यदि आपकी कक्षा अपने स्वयं के विनाशक की घोषणा करती है, या प्रतिलिपि प्रतिलिपि बनाता है, तो उसे निहित संचालन नहीं मिलेगा; आपको अपना खुद का परिभाषित करने की आवश्यकता होगी। लेकिन यदि आप ऊपर दी गई सलाह का पालन करते हैं, सही ढंग से प्रबंधित प्रकार है कि किसी भी विशेष हैंडलिंग की जरूरत नहीं है से यह रचना है, तो आप इन बातों में से किसी की घोषणा करने की जरूरत नहीं होनी चाहिए।)

+0

तो कंपाइलर को इसे अंतर्निहित बनाने के लिए अभी भी पर्याप्त कुशल है? या मुझे पॉइंटर्स का उपयोग करना चाहिए? – wjk2a1

+3

@ wjk2a1: निहित संस्करण का उपयोग संभवत: संकेत के एक अतिरिक्त स्तर को शुरू करने से अधिक कुशल होगा, और निश्चित रूप से सरल और कम त्रुटि प्रवण होगा। यदि आपको व्यक्तिगत सूचक अपडेट की लागत के बारे में चिंता करने की ज़रूरत है, तो आपको अपने दृष्टिकोणों की लागत को मापने की आवश्यकता होगी। –

+0

बहुत उपयोगी, धन्यवाद! – wjk2a1

3

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

1

डिफ़ॉल्ट चाल निर्माता और asignment संकलक द्वारा उत्पन्न ले वर्ग के प्रत्येक सदस्य के लिए कदम निर्माता/asignment कॉल करेंगे।

अपने वर्ग केवल कच्चे सदस्य हैं, "चार * बफर" उदाहरण के लिए, आप अपने खुद के चाल आपरेशन लिखने के लिए की है।

यदि आपका वर्ग केवल, उदाहरण के लिए "वेक्टर" "सदस्यों कामयाब" है, तो आप वर्ग के लिए डिफ़ॉल्ट चाल संचालन ठीक हो जाएगा, क्योंकि यह प्रतिनिधियों प्रत्येक सदस्य के आपरेशन।

:

यदि आपका वर्ग "प्रबंधित सदस्यों" है "कच्चे सदस्यों", वेक्टर और उदाहरण के लिए int * के साथ मिश्रित, अपने आंदोलन के संचालन कच्चे संसाधनों का मार्गदर्शन चाल करते हैं और प्रबंधित वस्तुओं के लिए कदम आपरेशन फोन करना होगा

class MyObject { 
public: 
    // ... 


    MyObject(MyObject&& other) : vector1(std::move(other.vector1)) { 
     // We use vector's move constructor^

     // and then move ourself the char* buffer 
     buffer1 = other.buffer1; 
     other.buffer1 = nullptr;   
    } 

    MyObject& operator=(MyObject&& other) { 
     // We use vector's move asignment operator 
     vector1= std::move(other.vector1); 

     // and then move ourself the char* buffer 
     std::swap(buffer1,other.buffer1); 
     return *this; 
    } 

    //... 
private: 
    vector<char> vector1; 
    char * buffer1; 
}; 

std :: move (other.vector1) की आवश्यकता है क्योंकि के अंदर जो अन्य काम करता है। वेक्टर 1 एक अंतराल है। हमें कंपाइलर को बताना होगा कि हम बाद में फ़ंक्शन कोड में वेक्टर 1 मान का उपयोग नहीं करेंगे, इसलिए इसका मूल्य स्थानांतरित किया जा सकता है।

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