2012-07-15 23 views
26

सी ++ 11 में, हम एक नाशक घोषित करने के लिए स्वचालित रूप से जेनरेट होने के लिए सक्षम हैं:डिफ़ॉल्ट शुद्ध आभासी नाशक

struct X { 
    virtual ~X() = default; 
}; 

इसके अलावा, हम एक नाशक घोषित आभासी शुद्ध होने के लिए कर सकते हैं:

struct X { 
    virtual ~X() = 0; 
}; 

मेरा सवाल है: विनाशक को दोनों घोषित करने के लिए कैसे ऑटो उत्पन्न और शुद्ध वर्चुअल? निम्न सिंटैक्स तरह लग रहा है सही नहीं है:

struct X { 
    virtual ~X() = 0, default; 
}; 

न ही यह एक:

struct X { 
    virtual ~X() = 0 default; 
}; 

संपादित करें: कुछ सवाल करने के उद्देश्य पर स्पष्टीकरण

struct X { 
    virtual ~X() = 0 = default; 
}; 

न तो इस में से एक है । असल में मैं खाली कक्षा को गैर-तत्काल आधार वर्ग होना चाहता हूं, लेकिन व्युत्पन्न वर्ग तत्काल है, तो कक्षा में शुद्ध वर्चुअल विनाशक होना चाहिए। लेकिन दूसरी तरफ, मैं एक .cpp फ़ाइल में परिभाषा प्रदान नहीं करना चाहता हूं। तो मुझे default के बराबर कुछ प्रकार की तंत्र की आवश्यकता है। मुझे आश्चर्य है कि किसी को समस्या का समाधान करने का कोई विचार है।

+2

आप कर सकते हैं 'आभासी ~ एक्स() = 0 {}'? अब फिर से सोचें कि आप क्या करने की कोशिश कर रहे हैं। – Xeo

+4

@Xeo: हाँ आप कर सकते हैं। लेकिन उस वाक्यविन्यास के साथ नहीं; आपको एक गैर-इनलाइन कार्यान्वयन प्रदान करना होगा। किसी भी शुद्ध वर्चुअल फ़ंक्शन में डिफ़ॉल्ट कार्यान्वयन हो सकता है - इसका अर्थ यह है कि गैर-सारणित व्युत्पन्न कक्षाएं * फ़ंक्शन को कार्यान्वित करनी चाहिए, लेकिन उनके कार्यान्वयन के हिस्से के रूप में माता-पिता के डिफ़ॉल्ट कार्यान्वयन को कॉल कर सकती है। – JohannesD

+1

@ जोहान्सडी: मुझे पता है कि, माइकल के उत्तर पर मेरी टिप्पणी देखें, लेकिन '= डिफ़ॉल्ट' मूल रूप से '{}' कक्षा में है (यदि आपके पास कोई सदस्य नहीं है)। – Xeo

उत्तर

39

शुद्ध वर्चुअल विधि को परिभाषित करने के लिए, आपको घोषणा से अलग परिभाषा की आवश्यकता है।

इसलिए

:

struct X { 
    virtual ~X() = 0; 
}; 

X::~X() = default; 
+0

यहां एक [आइडियान उदाहरण का लिंक] (http://ideone.com/Y4iPA) है जो सफलतापूर्वक संकलित करता है। –

+0

डर्न, जब आप प्रभावी सी ++ की मेरी प्रति प्राप्त कर रहे थे (जहां यह पुराने वाक्यविन्यास का उपयोग करके दिखाया गया है) –

+3

यह उत्तर गलत है! आपको अभी भी लाइन 'एक्स :: ~ एक्स() = डिफ़ॉल्ट डालना होगा; '.cpp फ़ाइल में, अन्यथा' एकाधिक परिभाषा 'लिंकिंग त्रुटि होगी। –

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