2010-12-13 16 views
6

other topic और प्रतिक्रियाओं ने मुझे इस प्रश्न से पूछा:सी ++ में, संरचना वास्तव में कक्षा क्यों है?

क्यों C++ struct को class की तरह व्यवहार करने की अनुमति देता है? एक तरफ, सी ++ ने इसे C-struct के साथ xxx14 सार्वजनिक रूप से (जैसे सी में) द्वारा सार्वजनिक रूप से बनाकर C-struct के साथ संगत बना दिया, जबकि दूसरी तरफ, यह कक्षाओं से विरासत में रहने और इसे लागू करने की अनुमति देकर इसे समान दिखता है अन्य ऑब्जेक्ट उन्मुख तकनीकें (अब C-struct की तरह नहीं)। यह ओओपी के साथ इसे सिर्फ पुराने पुराने C-struct क्यों नहीं बनाया? कोई विशेष कारण?

+7

"क्यों सी ++ ब्ला ब्लाह ..." पर आपके हालिया प्रश्नों का उत्तर "क्यों नहीं?" द्वारा दिया जा सकता है। मुझे लगता है कि सी ++ इस तरह से करता है, और जो लोग मानक विकसित करते हैं उन्हें भी पसंद आया, यही कारण है कि उन्होंने ऐसा किया। – ybungalobill

+1

@ybungalobill: आजकल मैं केवल सी ++ वाक्यविन्यास/उपयोग की खोज नहीं कर रहा हूं, बल्कि उनके पीछे दर्शन भी देख रहा हूं। यही कारण है कि आप देखते हैं "क्यों सी ++ ब्ला ब्ला .."। :-) – Nawaz

+6

तो शायद आपको "सी ++ के डिजाइन और विकास" को पढ़ना चाहिए –

उत्तर

6

देखने के एक भाषा की दृष्टि से, संरचनाओं और यूनियनों वर्ग के बस प्रकार हैं। यदि भाषा में कम अवधारणाएं हैं (एक छोटे अक्षर 'सी' के साथ) भाषा भाषा विनिर्देश सरल बनाता है और यह भाषा को कम त्रुटि प्रवण निर्दिष्ट करता है क्योंकि प्रत्येक आम संपत्ति को वर्तनी देने के लिए कुछ 'स्पष्ट' बाहर याद करना आसान होता है प्रत्येक संरचनाओं, यूनियन और गैर-संरचना, गैर-संघ वर्गों के लिए।

सी ++ कक्षाओं में सी संरचनाओं पर बहुत अधिक संभावित कार्यक्षमता है लेकिन सी संरचनाओं को अपरिवर्तनीय सी ++ वर्ग के रूप में देखा जा सकता है, इसलिए यह बिल्कुल सरल है कि उन्हें यह बिल्कुल सही हो। विशेष संरचना अवधारणा के साथ-साथ कक्षा अवधारणा रखने का कोई लाभ नहीं है।

आईएसओ/आईईसी से

14882: 2003, 9 [वर्ग]/4:

एक संरचना एक वर्ग वर्ग-कुंजीstruct साथ परिभाषित किया गया है; इसके सदस्य और आधार वर्ग डिफ़ॉल्ट रूप से सार्वजनिक होते हैं। संघकक्षा-कुंजीunion के साथ परिभाषित एक वर्ग है; इसके सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं और इसमें एक समय में केवल एक डेटा सदस्य होता है।

+0

मुझे यह पोस्ट पसंद आया। मेरे द्वारा +1! – Nawaz

1

सी में केवल शुरुआत करने के लिए structs थे। ऑब्जेक्ट ओरिएंटेशन तब शुरू हुआ जब पुस्तकालयों को डिजाइन किया गया था जब उन संरचनाओं के पॉइंटर्स लाइब्रेरी फ़ंक्शंस के सेट पर पारित किए गए थे जो उस संरचना पर निर्भर थे। एक अच्छा उदाहरण Win32 एपीआई है। यह एक सी ++ इंटरफ़ेस नहीं है, यह एक सी इंटरफ़ेस है; लेकिन यह अभी भी ऑब्जेक्ट उन्मुख है।

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

विरासत, बहुरूपता; कौन परवाह करता है? लोग सी के साथ ठीक थे, और अभी भी सी

+0

स्कूल के नियम: मुझे यह पोस्ट भी पसंद आया। अच्छी पोस्ट :-) मेरे द्वारा +1! – Nawaz

+0

स्कूल: कृपया ध्यान दें कि अतिरिक्त फ़ंक्शन पॉइंटर्स (vtable) केवल तभी आवश्यक है जब वर्चुअल फ़ंक्शन शामिल हों। "सामान्य" सदस्य फ़ंक्शंस को स्थिर रूप से हल किया जाता है और अतिरिक्त मेमोरी की आवश्यकता नहीं होती है। –

7

के साथ ठीक कर रहे हैं यह मौजूदा स्ट्रक्चर को अधिक प्राकृतिक तरीके से सी ++ कोड के साथ फिट करने की अनुमति देता है। उदाहरण के लिए, आप एक संरचना में सदस्य कार्यों को जोड़ सकते हैं और एक संरचना से प्राप्त कर सकते हैं, जो संभव नहीं होगा यदि structs और कक्षाएं विभिन्न सार्वभौमिकों में रहें।

स्ट्रॉस्ट्रप का मूल उद्देश्य परंपरागत सी-शैली "संरचना" शिविर और ओओ "कक्षा" भीड़ के बीच समुदाय के फ्रैक्चरिंग से बचने के लिए था। उन्होंने दो की बजाय सिर्फ एक अवधारणा के लाभों का भी उल्लेख किया।

+0

"यह मौजूदा स्ट्रक्चर को सी ++ कोड के साथ अधिक प्राकृतिक तरीके से फिट करने की इजाजत देता है। उदाहरण के लिए, आप एक स्ट्रक्चर में सदस्य फ़ंक्शन जोड़ सकते हैं [..]" ... हाँ यह मेरा प्रश्न है: यह हमें सदस्य जोड़ने की अनुमति क्यों देता है कार्यों? हमारे पास कक्षा है, है ना? – Nawaz

+0

@ नवाज यह संघों को सदस्य कार्यों को जोड़ने की अनुमति भी देता है। हम संघों के बजाय कक्षाओं का उपयोग नहीं कर सकते हैं, जिसका उद्देश्य उनके लिए उपयोग किया जाता है। –

+0

@ जोहान्स शाएब: 'संघ' मामले में, यह समझ में आता है, क्योंकि "हम संघों के बजाय कक्षाओं का उपयोग नहीं कर सकते हैं, जिसका उद्देश्य उनके लिए उपयोग किया जाता है"। सही समझ में आता है। लेकिन संरचना के बारे में कैसे? – Nawaz

1

एक सी इंटरफ़ेस बनाते समय आप वास्तव में कक्षा होने के लिए संरचना के रूप में घोषित करने की अनुमति देते हुए टाइप-सुरक्षा की अनुमति देते हैं।

आप आगे अपने सी इंटरफेस के लिए अपने struct की घोषणा कर सकते हैं:

struct Foo; 

आप इस पर तरीकों की घोषणा

void doStuffThatModifiesFoo(struct Foo * foo, ...); 
struct Bar getStuffFromFoo(const struct Foo * foo); 

तुम भी इसके लिए बना सकते हैं और नष्ट तरीकों लिख सकते हैं कर सकते हैं।

नीचे आप फू को सी संरचना के रूप में लागू नहीं करते हैं बल्कि एक वर्ग के रूप में लागू करते हैं लेकिन आपके सी क्लाइंट को यह जानने की आवश्यकता नहीं है। यह शून्य के रूप में इसे पास करने से बेहतर है * फिर कास्टिंग (सुरक्षित नहीं है अगर कोई आपको शून्य से * पूरी तरह से अलग प्रकार से पास करता है और आप इसे कास्ट करते हैं)।

+1

कड़ाई से बोलते हुए, यह कक्षा-बनाम-संरचना चीज नहीं है। शुद्ध सी –

+0

में एक ही चाल संभव है लेकिन जब भी आप सी ++ में कुछ लागू कर रहे हैं, तब भी यह सहायक होता है, लेकिन वैश्विक कार्य के साथ एक संरचना के रूप में अपने सदस्य कार्यों के साथ वर्ग को बेनकाब करने की आवश्यकता है। – Mephane

2
  1. संरचना क्षेत्रों के लिए "सार्वजनिक" डिफ़ॉल्ट सी कोड के साथ संगतता के लिए आवश्यक है जो संरचना फ़ील्ड तक पहुंच सकता है।
  2. संरचना विरासत के लिए "सार्वजनिक" डिफ़ॉल्ट आवश्यक है ताकि बाल वर्ग आधार संरचना के स्थान पर उपयोग किया जा सके।
  3. यह (यानी नामंज़ूर एक्सेस प्रकार विनिर्देशक और उस में विधि) कक्षाओं तुलना में एक अलग डेटा प्रकार में struct बनाने के लिए संभव हो सकता है, लेकिन यह है कि प्रोग्रामिंग के लिए दोनों असुविधाजनक हो सकता है और संकलक के लिए डेवलपर्स अनावश्यक बहुत काम जोड़ना होगा ।
+0

पहले दो बिंदु अप्रासंगिक हैं, मैं यहां सोचता हूं, क्योंकि यह मेरे प्रश्न का उत्तर देने का प्रयास नहीं करता है। तीसरा बिंदु, दूसरा आधा बयान सत्य प्रतीत नहीं होता है। हम पहले ही सी में संरचना का उपयोग कर चुके हैं इसलिए सादे सी-स्ट्रक्चर का उपयोग करना असुविधाजनक नहीं है! – Nawaz

+0

1-2 वहां हैं क्योंकि ये कारण हैं कि कक्षा के लिए एक नया कीवर्ड क्यों जोड़ा जाना था। और "असुविधाजनक" से मेरा मतलब वृद्धिशील परिवर्तन है। यानि आपके अनुसार, जब मैं सी परियोजना से प्रतिलिपि बनाई गई संरचना के एक क्षेत्र की रक्षा करना चाहता हूं, तो मुझे इसे कक्षा में बदलना होगा और अन्य सभी सदस्यों को सार्वजनिक रूप से घोषित करना होगा, और संभवतः सभी विरासत को ठीक करना होगा। – Shelwien

0

"सी" समस्या के साथ संगतता केवल एक दिशा में है: पुराना, वैध सी-कोड भी सी ++ कोड के रूप में संकलित होना चाहिए। दूसरी तरफ दौर असंभव है जैसे ही किसी भी भाषा सुविधा में केवल सी ++ का उपयोग किया जा रहा है।

इसका अर्थ है सी ++ में, आप हमेशा कक्षाएं लिखते हैं, आप कीवर्ड struct कीवर्ड का उपयोग करके छोड़ सकते हैं; हालांकि, मेरे साथ कुछ, लगता है कि वे यह दिखाने के लिए काम में आते हैं कि एक वर्ग सिर्फ नामित मूल्यों का एक साधारण संग्रह है, जिसमें कोई वास्तविक encapsulation या संभवतः जटिल व्यवहार नहीं है।

+0

कई आधुनिक सी ++ स्टाइलगाइड्स संरचना का उपयोग करना पसंद करते हैं क्योंकि यह जनता के लिए डिफ़ॉल्ट है, इसलिए आपको पहले सार्वजनिक इंटरफ़ेस पढ़ना होगा। –

+0

@ फैबियो: हम्म, "कई"? मुझे नहीं लगता कि मैंने कभी भी किसी भी शैली गाइड को यह सुझाव दिया है। मैं ऐसा करता हूं जब मैं इसके साथ दूर हो सकता हूं, क्योंकि आपने जो कारण बताया है, लेकिन मुझे यह याद नहीं है कि इसे कहीं और अनुशंसा की जा रही है। एक उदाहरण मिला? – jalf

+0

@jalf: मुझे नहीं पता कि उन्होंने इसे कहीं नीचे लिखा है, लेकिन यह बढ़ावा कोड में काफी आम है। एलएलवीएम केवल कुछ हिस्सों (टेम्पलेट्स) के लिए इसका उपयोग करता प्रतीत होता है। –

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