2014-07-11 3 views
8

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

क्या सी ++ कंपाइलर को बताने का कोई तरीका है कि एक स्पष्ट रूप से घोषित प्रतिलिपि निर्माता/असाइनमेंट ऑपरेटर को बाद में चलाने वाले कुछ अतिरिक्त कोड को छोड़कर, एक अंतर्निहित की तरह काम करना चाहिए? (और क्या यह सिंटैक्स सी ++ 9 8 संगत है, या क्या इसे सी ++ 11 या सी ++ 14 समर्थन की आवश्यकता है?)

+16

उस डेटा सदस्य के लिए उचित RAII wrapper लागू करें, तो डिफ़ॉल्ट निर्माता सभी चीज़ों के लिए काम करेंगे। –

उत्तर

8

यदि आप उचित आरएआईआई रैपर में विशिष्ट हैंडलिंग को अलग कर सकते हैं क्योंकि इगोर टंडेटनिक ने सुझाव दिया है: जाओ उसके लिए।

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

struct x_base { 
    int a,b,c,d; 
    std::string name; 
}; 

struct x : x_base { 
    x(const x& other) 
     : x_base(other) 
    { 
     descr = "copied "; 
     descr += name; 
     descr += " at "; 
     descr += CurrentTimeAsString(); 
     std::cout << descr << "\n"; 
    } 
    void operator = (const x& other) 
    { 
     x_base::operator =(other); 
     descr = "assigned "; 
     descr += name; 
     descr += " at "; 
     descr += CurrentTimeAsString(); 
     std::cout << descr << "\n"; 
    } 
    std::string descr; 
}; 

आप बाद में डेटा सदस्यों को बताया कि विशिष्ट निपटने की जरूरत नहीं है जोड़ते हैं, आप बस उन्हें x_base को जोड़ सकते हैं ।

+1

यह सिद्धांत का लाभ उठाता है कि एक गैर-संघ वर्ग के लिए अंतर्निहित रूप से परिभाषित प्रतिलिपि निर्माता अपने आधार और सदस्यों (मानक सी ++, संप्रदाय 12.8 pt 15) की सदस्यवार प्रति करता है। ध्यान दें कि सदस्य प्रतिलिपि के आदेश पर कुछ बाधाएं हैं। – Christophe