2009-02-23 20 views
25

से कक्षा प्राप्त कर सकता हूं प्रश्न यह सब वास्तव में कहता है। क्या मुझे एक संरचना से कक्षा प्राप्त करने की इजाजत है, या क्या मुझे अपनी कक्षा को एम्बेड करने वाली कक्षा बनाना चाहिए और दो के बीच स्थानांतरित करने के लिए कॉपी कन्स्ट्रक्टर और एक = ऑपरेटर को परिभाषित करना चाहिए?, क्या मैं एक संरचना

+0

एमएफसी के वर्ग सीआरईटी संरचना टैगरेक्ट, AFAICS से विरासत में विरासत। – Constantin

+0

मेरा बुरा - प्रश्न का पाठ बदल गया। –

उत्तर

33

सी ++ struct में (लगभग) class (विभिन्न डिफ़ॉल्ट पहुंच स्तर को छोड़कर) का समानार्थी है, तो हाँ, आप कर सकते हैं।

struct A { 
// fields are public by default 
}; 

class B: public A { 
// fields are private by default 
}; 

मैं एमएफसी से परिचित नहीं हूं, लेकिन यह सी और सी ++ एपीआई दोनों को बनाए रखने के प्रयास की तरह दिखता है।

+0

इसके लिए धन्यवाद। मुझे पूरा यकीन था कि यह ठीक था, लेकिन वास्तव में इसे अभ्यास में कभी नहीं देखा था। –

9

बेशक आप हैं। विरासत के संबंध में अलग क्या है कि यदि आप कक्षा को परिभाषित करते हैं, तो यह अन्य वर्गों/structs से निजी प्राप्त होगा। यदि आप एक struct को परिभाषित करने और एक वर्ग या struct से निकाले जाते हैं, तो यह डिफ़ॉल्ट रूप से एक सार्वजनिक विरासत होगा:

// the following two are equivalent except that one time class is 
// used and the other time struct 
struct f : g { }; 
class f : public g { }; 

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

सी structs उन सदस्यों का भी खुलासा करते हैं जिन्हें संभावित रूप से कक्षा में नहीं उजागर किया जाना चाहिए। कंटेंटमेंट जो खुलासा हुआ है उस पर सटीक नियंत्रण की अनुमति देता है और क्या प्राप्त/सेट फ़ंक्शंस द्वारा नहीं किया जाता है और आप अभी भी इसे नग्न सी संरचना ऑब्जेक्ट में प्रतिलिपि या संदर्भ देने दे सकते हैं।

7

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

यह एमएफसी द्वारा कई सी structs के लिए उपयोग किया जाने वाला दृष्टिकोण है (आपके प्रश्न में जो कुछ भी है, उसके विपरीत)।

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

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