2010-12-13 18 views
7

मैं समझता हूं कि सी ++ (दो?) में structs और कक्षाओं के बीच बहुत कम अंतर हैं। जैसा भी हो सकता है, मुझे निर्देश दिया गया है कि साधारण छोटी चीजें जैसे नोड्स को परिभाषित करने के लिए structs का उपयोग करने के लिए निर्देश दिया गया हो, जिन्हें सदस्य कार्यों की आवश्यकता नहीं हो सकती है (इस तथ्य के बावजूद कि मैं तकनीकी रूप से सदस्य कार्यों को शामिल कर सकता हूं)। उदाहरण के लिए मैं इस प्रकार एक लिंक्ड सूची वर्ग के लिए एक निजी सदस्य के रूप में एक नोड से परिभाषित करें:क्या मैं कन्स्ट्रक्टर को परिभाषित किए बिना ढेर पर एक नई संरचना बना सकता हूं?

class LinkedList { 
    struct Node { 
    MyObject *data; 
    Node *next; 
    }; 

    Node *list; 

}; 

इस मामले में, तथापि, यह ढेर पर इस struct का एक नया उदाहरण बनाने के लिए संभव है, या मैं करूंगा एक कन्स्ट्रक्टर को परिभाषित करने की आवश्यकता है? नए ऑपरेटर के बिना ढेर पर चीजों को बनाने का कोई तरीका है? या, बेहतर अभी तक: क्या यह धारणा के लिए इतनी कसकर चिपकने के लिए अनावश्यक है कि मुझे structs के लिए सदस्य कार्यों को परिभाषित नहीं करना चाहिए? क्या मुझे आगे बढ़ना चाहिए और एक को परिभाषित करना चाहिए? या अगर मैंने ऐसा किया, तो क्या यह स्वीकार करना होगा कि नोड वास्तव में आंतरिक संरचना के बजाय आंतरिक वर्ग बनने के लिए कुछ भी है? क्या मुझे वास्तव में इस तरह की चीजों के बारे में चिंता करना चाहिए? कौन सा पठनीय है?

धन्यवाद!

उत्तर

5

हालांकि, इस मामले में, ढेर पर इस संरचना का एक नया उदाहरण बनाना संभव है, या मुझे एक निर्माता को परिभाषित करने की आवश्यकता होगी? नए ऑपरेटर के बिना ढेर पर चीजों को बनाने का कोई तरीका है?

जैसा कि पहले बताया गया था, आप या तो नए या मॉलोक के माध्यम से ढेर पर एक नया उदाहरण बना सकते हैं।

या बेहतर अभी तक: क्या यह धारणा के लिए इतनी कसकर चिपकने के लिए अनावश्यक है कि मुझे structs के लिए सदस्य कार्यों को परिभाषित नहीं करना चाहिए?

यह अधिक दिलचस्प सवाल है। सी ++ में struct और class के बीच प्रमुख (केवल?) अंतर डिफ़ॉल्ट पहुंच विनिर्देशक है। यही है, struct सार्वजनिक पहुंच के लिए डिफ़ॉल्ट और class निजी पर डिफ़ॉल्ट। मेरी राय में, यह अंतर है जो निर्धारित करना चाहिए कि आप किस दो का उपयोग करते हैं। असल में, यदि उपयोगकर्ताओं को सीधे सदस्यों का उपयोग करना चाहिए, तो यह struct होना चाहिए।

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

तो, छोटे (उदा। Std :: जोड़ी) ऑब्जेक्ट्स या जिनके उपयोग सीमित हैं (एक निजी आंतरिक कक्षा में) सदस्यों के लिए डिफ़ॉल्ट पहुंच अच्छी बात हो सकती है, और इन मामलों में मैं उन्हें structs बना दूंगा।

4

Malloc ठीक काम करता है:

Node *n = (Node*)malloc(sizeof(*n)); 

बस free() कुछ भी malloc() 'घ और delete कुछ भी new' घ के लिए याद है।

+1

आपको यह उल्लेख करना चाहिए कि यदि कोई है तो मॉलोक एक कन्स्ट्रक्टर नहीं चलाएगा। –

+0

मुफ्त में एक विनाशक को कॉल न करें :) – Arunmu

+0

और वह 'कॉलोक' भी 'मेमसेट (0) ' – ruslik

2

यहां तक ​​कि अगर आप एक निर्माता को परिभाषित नहीं है, संकलक एक डिफ़ॉल्ट बना दिया जाएगा और इसलिए आप ऑपरेटर 'नए' का उपयोग कर सकते हैं:

Node *n = new Node; 

AFAIAC, एक struct, एक वर्ग है सिवाय इसके कि अपने ' प्रचार "डिफ़ॉल्ट उलट दिया जाता है।

+0

करेगा, लेकिन मेरे मामले में संरचना में पॉइंटर नोड्स हैं: क्या डिफ़ॉल्ट कन्स्ट्रक्टर उन्हें न्यूल पर इंगित करेगा? – Ziggy

+0

@ ज़िग्गी: नहीं; निहित रूप से घोषित डिफ़ॉल्ट कन्स्ट्रक्टर सभी पॉइंटर सदस्यों को अनियमित कर देगा। यदि आप उन्हें प्रारंभ करना चाहते हैं तो आपको अपना खुद का कन्स्ट्रक्टर घोषित करना चाहिए। (वैकल्पिक रूप से, आप 'new' (यानी, 'नया नोड()') के मान-प्रारंभिक रूप का उपयोग कर सकते हैं। यदि आपके पास [अच्छी प्रारंभिक सी ++ पुस्तक] नहीं है (http://stackoverflow.com/questions/388242/the-definitive-c++-book-guide-and-list), एक प्राप्त करने पर विचार करें। –

2

इस मामले में, हालांकि, यह संभव ढेर पर इस struct का एक नया उदाहरण बनाने के लिए है, या मैं एक निर्माता को परिभाषित करने की आवश्यकता होगी?

हाँ आप इसे कन्स्ट्रक्टर को परिभाषित किए बिना ढेर पर बना सकते हैं।

क्या नए ऑपरेटर के बिना ढेर पर चीजों को बनाने का कोई तरीका है?

आप 'malloc' का उपयोग कर सकते हैं और स्मृति उपयोग 'मुक्त' जारी करते समय। अन्यथा कोई दूसरा रास्ता नहीं है।

या, बेहतर अभी तक: यह मुझे धारणा है कि मैं structs के लिए सदस्य कार्यों को परिभाषित नहीं किया जाना चाहिए करने के लिए इतना कसकर चिपक करने के लिए अनावश्यक है?

व्यक्तिगत रूप से यदि मुझे सदस्य कार्य करने के लिए मेरी संरचना की आवश्यकता है तो मैं इसे कक्षा में बदल देता हूं। मैं structs का उपयोग करता हूं क्योंकि एक ओकैमल में रिकॉर्ड का उपयोग कर सकता है।

1

क्या मुझे वास्तव में इस तरह की चीजों के बारे में चिंता करना चाहिए?

हां। जैसा कि आप कहते हैं, वास्तव में structs और कक्षाओं के बीच कोई महत्वपूर्ण अंतर नहीं हैं।यदि आपको struct बनाने के लिए कहा गया है, और इसे कम से कम एक सदस्य फ़ंक्शन की आवश्यकता है, तो सदस्य फ़ंक्शन परिभाषित करें।

यह वास्तव में कोई बड़ा सौदा नहीं है।

लेकिन इसके अलावा, आप निश्चित रूप से कंस्ट्रक्टर्स

को देखते हुए एक struct S, आप कर सकते हैं (अन्यथा malloc बल्कि सी में व्यर्थ भाषा भी कंस्ट्रक्टर्स नहीं किया है कि हो सकता है) के बिना ढेर-आवंटित कर सकते हैं structs आप किस तरह के प्रारंभिकरण के आधार पर new S या new S() पर कॉल करें। यदि आप एक कन्स्ट्रक्टर को परिभाषित नहीं करते हैं, तो कंपाइलर आपके लिए एक बनाता है।

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

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