C ++ का उपयोग करना लेकिन भाषा की विशिष्ट विशेषताओं का उपयोग नहीं करना चाहिए, C पर स्विच करना चाहिए?


16

मैं अपने खाली समय में एक NES एमुलेटर को एक शौक के रूप में विकसित कर रहा हूं। मैं C ++ का उपयोग करता हूं क्योंकि मैं जिस भाषा का उपयोग करता हूं, वह ज्यादातर और ज्यादातर पसंद है।

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

मैं इसे प्रदर्शन में हासिल करने के लिए नहीं करूंगा, यह एक साइड इफेक्ट के रूप में आ सकता है, लेकिन विचार यह है कि अगर मुझे इसकी आवश्यकता नहीं है तो मुझे C ++ का उपयोग क्यों करना चाहिए?

C ++ की एकमात्र विशेषता जो मैं उपयोग कर रहा हूं वह डेटा और विधियों को इनकैप्सुलेट करने के लिए कक्षाएं हैं, लेकिन यह भी संरचना और कार्यों के साथ किया जा सकता है, मैं नया और डिलीट का उपयोग कर रहा हूं, लेकिन साथ ही साथ मॉलोक और फ्री का उपयोग कर सकता हूं, और मैं कर रहा हूं केवल कॉलबैक के लिए वंशानुक्रम का उपयोग करना, जो कार्यों के लिए संकेत के साथ प्राप्त किया जा सकता है।

याद रखें, यह एक शौक परियोजना है, मेरे पास कोई समय सीमा नहीं है, इसलिए ओवरहेड समय और काम की आवश्यकता होती है जिसे फिर से लिखना एक समस्या नहीं है, मजेदार भी हो सकता है। तो, सवाल C या C ++ है?


3
यह मुझे लगता है कि आप पहले से ही अपने आप को जवाब दे चुके हैं: यदि आपको केवल C की आवश्यकता है तो C ++ का उपयोग क्यों करें? ऐसी कई स्थितियां हैं जिनमें C पूरी तरह से ठीक है।
जियोर्जियो

3
@ जियोर्जियो: और वे सभी पहले साठ सेकंड के बाद वाष्पित हो जाते हैं और आपको अपना कोड बनाए रखने की आवश्यकता होती है।
२१:

7
I use C++ because is the language I use mostly, know mostly and like mostly.और आपके प्रश्न का उत्तर है। जब आपकी समस्या वर्तमान भाषा हल नहीं कर सकती है तो आपको केवल भाषाओं को मध्य परियोजना में बदलना चाहिए। I don't use templates, operator overloading, polymorphism, inheritance.यह सी पर स्विच करने की तुलना में अवधारणाओं को सीखने और उपयोग करने के लिए बहुत अधिक मूल्यवान होगा। चूंकि यह एक शौक परियोजना है, इसलिए उन कुछ चीजों का उपयोग क्यों न करें जिन्हें आपने पहले इस्तेमाल नहीं किया है? आप हमेशा C में एक और प्रोजेक्ट शुरू कर सकते हैं और भाषा सीख सकते हैं, लेकिन अपने वर्तमान प्रोजेक्ट के लिए इसे स्विच करने का कोई मतलब नहीं है।
यानिस

4
मैं अपनी लिखी हर परियोजना में 100% भाषा का उपयोग नहीं करता। आपको पता है कि C ++ सबसे अच्छा है, आपको उन विशेषताओं का उपयोग करने के लिए अच्छे कारण मिल सकते हैं जिन्हें आपने पहले उपयोग नहीं किया है। आप सी ++ के इलाज के लिए एक अधिक सुरक्षित सी के रूप में, एक बार आप मानक पुस्तकालय सामान का उपयोग शुरू और बढ़ावा निर्माणों की तरह शुरू कर सकते हैं std::shared_ptr, std::unique_ptr, boost::scoped_ptr, std::vector, std::deque, std::mapकॉलबैक कार्यों के लिए आदि,, functors के उपयोग में देखो, और सी ++ 11 में, आप लैम्ब्डा कार्यों जैसी चीजों का उपयोग भी शुरू कर सकते हैं।
22

3
@ जियोर्जियो: हां। इनफ़िनिटी से जुड़ी सूची को रोल करना अनावश्यक त्रुटियों को उत्पन्न करने के लिए बाध्य है।
डेडएमजी

जवाबों:


40

आप इसे अभी उपयोग नहीं कर रहे हैं, लेकिन अगली बार जब आप मेमोरी को लीक करते हैं या एक डबल डिलीट करते हैं, तो आप वापस आने के लिए भीख माँग रहे होंगे std::vector<T>, std::unique_ptr<T, Del>और std::shared_ptr<T>, जो उन समस्याओं को आसानी से हल कर सकते हैं- लगभग तुच्छ रूप से। यह वही होता है जो C ++ पर C का उपयोग करने वाले सभी लोगों के लिए होता है, आखिरकार, और होशियार लोग बग को खत्म करने से पहले इंतजार नहीं करते।

कोड जो सीधे उपयोग करता है newऔर deleteवास्तव में C ++ में नहीं होता है, यह उस तरह के आधे घर में होता है जिसे हम "सी विद क्लासेस" कहते हैं। जहां भाषा 1985 के लगभग था कि यह सभी संभावना में विशेष रूप से करने के लिए सी ++ समान नहीं है, 2011 के लगभग, जहाँ भी आप सी सीखा ++ बस यह बहुत अच्छी तरह से कुछ है कि दुर्भाग्य से नहीं बल्कि आम और एक बेहतर शिक्षा के साथ है सिखाना नहीं किया था, आप होगा इन सुविधाओं का उपयोग खोजें।

विशेष रूप से, जैसा कि मैंने ऊपर सूचीबद्ध किया है, सी ++ के जेनेरिक डेटा संरचनाएं और संसाधन-प्रबंधन कक्षाएं बस मौलिक रूप से बड़े पैमाने पर बेहतर हैं जो कुछ भी सी को पेश करना है। यदि आप एक गतिशील रूप से आवंटित सरणी चाहते हैं, तो उपयोग करें std::vector<T>। यह एक बहुत ही सामान्य उपयोग मामला है। यदि आप उनका उपयोग नहीं कर रहे हैं, तो आपके कोड में अनावश्यक रूप से त्रुटि का भारी जोखिम है- विशेष रूप से संसाधन प्रबंधन से संबंधित। C ++ सुरक्षा और पुन: उपयोग कोड की गारंटी इस तरह से दे सकता है कि C कभी स्पर्श न कर सके।

हालाँकि, मुझे लगता है कि आप भी उम्मीद कर रहे होंगे। लाइब्रेरी उपभोक्ताओं के लिए टेम्प्लेट और ऑपरेटर ओवरलोड लिखना सामान्य नहीं है। यदि आपका कोड उपयोग करता है std::vector<T>, तो आपको ऐसा करने के लिए टेम्पलेट लिखने की आवश्यकता नहीं है। यदि आपका कोड उपयोग करता है std::string, तो कोई भी आपको अपने ऑपरेटरों को अधिभारित करने के लिए मजबूर नहीं कर रहा है। आपको केवल उन चीजों को लिखना है std::vector<T> और std::string- लेकिन फिर भी आप उनका पूरा फायदा उठा सकते हैं।

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

इसके अलावा, C से C ++ में प्रदर्शन में कोई लाभ नहीं है।


1
@ जियोर्जियो: make_sharedमौजूद है, और आप एक तुच्छ make_uniqueटेम्पलेट लिख सकते हैं जो समान काम करता है। यह सुरक्षित है।
21-16 बजे डेडएमजी

4
बहुत बढ़िया जवाब। सिर पर कील। C ++ इन छोटे पुस्तकालयों के लिए सबसे अधिक मूल्यवान है जिसका उपयोग हमें हमेशा करना चाहिए।
एंड्रेस जान टैक

2
@ जियोर्जियो: यह असुरक्षित है क्योंकि जब इस तरह के कई तर्क कहते हैं, तो आप अपवाद के मामले में स्मृति रिसाव प्राप्त कर सकते हैं, और make_sharedअधिक कुशल हैं। केवल कारखाने के कार्य गारंटी अपवाद सुरक्षा की पेशकश कर सकते हैं।
डेडएमजीन डे

6
@ tp1: डब्ल्यूटीएफ? कृपया अंग्रेजी में।
20-16 बजे डेडएमजी

2
@ लोरिस आपको सामान्य ज्ञान के लिए प्रशस्ति पत्र की आवश्यकता नहीं है। C ++ की तुलना में C को किस तरह से अधिक प्रदर्शनकारी होना चाहिए?
क्रिस का कहना है कि मोनिका

7

यहां तक ​​कि अगर आप C ++ विशिष्ट विशेषताओं का उपयोग नहीं करते हैं, तो C ++ के सख्त प्रकार के सिस्टम के कारण C ++ कंपाइलर C की तुलना में अधिक समस्याएं पकड़ सकता है।


6

मैं इसे दूसरी दिशा से देखूंगा। क्या आप C में कोड को फिर से लिखकर कुछ हासिल करेंगे ? यहां तक ​​कि एक विशुद्ध रूप से हॉबीस्ट प्रोजेक्ट पर भी, इस तरह के एक पुनर्लेखन के साथ जुड़ी लागत है। अगर मुझे लगता है कि कुछ और नहीं है, तो मुझे अवसर लागत कहा जाएगा - यानी, दूसरी चीजें जो आप उस समय में कर सकते थे यदि आप नहीं थे कर सकते अपना समय बर्बाद कर रहे इसे सी में फिर से लिखना।

नीचे पंक्ति: जब तक आपको नहीं लगता कि कोड का वास्तव में कुछ वातावरण में उपयोग किए जाने की संभावना है, जहां C ++ तक पहुंच वास्तव में सीमित है (या कोई नहीं), यह बहुत अच्छे समय की व्यर्थ बर्बादी होगी। कम से कम मेरे अनुभव में, यह आमतौर पर बहुत जल्दी से आगे बढ़ जाता है - कोड पर वापस सोचकर मैंने C ++ में लिखा है पड़ा , मैं बहुत स्पष्ट रूप से याद कर सकता हूं कि यहां तक ​​कि कुछ मामलों में भी ऐसा लगता है यह तुच्छ होना चाहिए, मैं शुरू में महसूस किए गए सी ++ की तुलना में बहुत अधिक विशेषताओं का उपयोग कर रहा था। सभी पर उपयोगी होने की बहुत उम्मीद करने के लिए, आपको C89 / 90 को लक्षित करने के लिए बहुत कुछ करना होगा, जिस स्थिति में आप जल्दी से चीजों को याद दिलाते हैं जैसे कि ब्लॉक की शुरुआत में सभी चर को परिभाषित करने के बजाय जहां वे वास्तव में हैं उपयोग किया गया।

संक्षेप में, जब तक कि आप सुनिश्चित नहीं हैं कि सी में फिर से लिखना एक वास्तविक लाभ प्रदान करेगा, वहाँ लगभग अनिवार्य रूप से बहुत बेहतर चीजें हैं।


+1 कुछ समय पहले मुझे एक और सी प्रोजेक्ट में इस्तेमाल होने के लिए एक लाइब्रेरी लिखना था और मुझे लगा कि इसे सी में लागू करने के लिए भी एक अच्छा विचार है, यार क्या बेवकूफ बेवकूफ था जो मैं वापस आ गया था।
क्रिस का कहना है कि मोनिका

1

अधिक सामान्य उत्तर के रूप में:

C ++ पर केवल इसलिए स्विच न करें क्योंकि आप इसमें से कुछ का उपयोग कर रहे हैं और अधिक विशिष्ट सुविधाएँ हैं। एक दिन आपको उन सुविधाओं की आवश्यकता हो सकती है, और आप अपना सिर पाउंड करेंगे क्योंकि आप सी का उपयोग कर रहे हैं।


1

हॉबीस्ट विकास के लिए, मैं सादे सी। सी और सी जैसी भाषाओं पर वापस जाने पर विचार करूँगा, जो छोटे शौक विकास मॉड्यूल पर समर्थित होने की अधिक संभावना है।

यहाँ कई उत्तर पेशेवर सॉफ्टवेयर प्रकार के हो सकते हैं। एक हॉबीस्ट के रूप में, आप लगातार या पूरे समय कोडिंग नहीं करेंगे। इसलिए विचार करें कि आप किस भाषा को याद रखते हैं या उसके भीतर भूल जाते हैं, यदि आप एक वर्ष के लिए अपनी परियोजना की तालिका बनाते हैं और फिर वापस आते हैं और कोडिंग में जंग लगने के बाद अपने कोड को पढ़ने की कोशिश करते हैं। C ++ में एक समृद्ध सुविधा सेट होने के कारण, आपकी कोडिंग शैली के आधार पर, पुन: अधिग्रहण करने में अधिक या कम समय लग सकता है।


1

आपके प्रश्नों का उत्तर देना आसान नहीं है, क्योंकि हम नहीं जानते कि आप अपनी भाषा के विशिष्ट कौशल (C vs C ++) को बेहतर बनाने के लिए प्रोजेक्ट पर काम कर रहे हैं या अन्य प्रोग्रामिंग स्किल्स (डिज़ाइन, समस्या को सुलझाने आदि) में सुधार कर रहे हैं।

"C ++ की एकमात्र विशेषता जो मैं उपयोग कर रहा हूं, वह डेटा और विधियों को इनकैप्सुलेट करने के लिए कक्षाएं है, लेकिन यह संरचना और कार्यों के साथ भी किया जा सकता है।" यह सच नहीं है। structsC, एन्कैप्सुलेशन का समर्थन नहीं करता है और इसमें फ़ंक्शंस (विधियाँ) नहीं हो सकती हैं - कम से कम फ़ंक्शंस जैसे पॉइंटर्स जैसी तकनीकों का उपयोग किए बिना नहीं। साथ ही, C में फ़ंक्शंस कमज़ोर हैं क्योंकि उन्हें ओवरलोड नहीं किया जा सकता है।

"मैं नए का उपयोग कर रहा हूं और डिलीट कर रहा हूं, लेकिन साथ ही साथ मॉलॉक और फ्री का भी उपयोग कर सकता हूं, और मैं केवल कॉलबैक के लिए इनहेरिटेंस का उपयोग कर रहा हूं, जो कि पॉइंटर्स टू फंक्शन के साथ हासिल किया जा सकता है।" जैसा कि डेडोग्राम ने उल्लेख किया है, सीधे उपयोग करते हुएnew और deleteC ++ का उपयोग करना प्रोत्साहित नहीं किया जाता है। इसके अलावा, OOP में IMHO (और GoF) वंशानुक्रम को केवल उस समय पसंद किया जाना चाहिए जब बहुरूपता की आवश्यकता होती है। और मुझे नहीं लगता कि कार्यों के लिए पॉइंटर्स का उपयोग करके सी में बहुरूपता (देर से बाध्यकारी) को प्राप्त करना तुच्छ है।

इसके अलावा, मैं आपको यह समझाने की कोशिश नहीं करूंगा कि C ++ C से "बेहतर" है क्योंकि यह वरीयता का मामला है और यह हमेशा उस समस्या पर निर्भर करता है जिसे आप हल करने की कोशिश कर रहे हैं (अपने NES एमुलेटर को विकसित करने के लिए OOP सुविधाओं का उपयोग करना) एक अच्छा विचार)।


1
structsसी में, वास्तव में, तरीकों को एनकैप्सुलेट करने के लिए उपयोग किया जा सकता है। आप बस फ़ंक्शन पॉइंटर्स की एक संरचना बनाते हैं, और जो भी आप चाहते हैं उन्हें इंगित करने के लिए उन्हें इनिशियलाइज़ करते हैं। एक उदाहरण के लिए lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 पर नज़र डालें ।
रॉबर्ट मार्टिन

ये सही है। टिप्पणी के लिए धन्यवाद, मैंने जवाब बढ़ाया।
साकिन

अच्छा लगा। एक और नाइट: सी में फ़ंक्शंस को ओवरलोड (थिंक ) किया जा सकता है printf, लेकिन ऐसा करने में आप किसी भी प्रकार की जाँच खो देते हैं। स्वीकार्य घोषणाओं का एक सीमित सेट होने का कोई तरीका नहीं है: यह या तो 1 है (और आपको टाइप चेकिंग) या "कई" (और सभी प्रकार की जाँच खो दें, महान व्यक्तिगत जोखिम पर)। सी में अधिकांश चीजों के साथ, यह संभव है लेकिन अक्सर असुविधाजनक है।
रॉबर्ट मार्टिन

कार्यों के लिए संकेत एक उन्नत सी तकनीक है? वास्तव में?
डोनल फैलो

@DonalFellows तुम सही हो, मैंने अतिशयोक्ति की। हटा दिया गया उन्नत ... :)
19

0

मैं बहुत शुरुआती हूं, इसलिए यहां मेरे 2 बिट्स आते हैं।

मैं Wibit.net पर C और C ++ सीख रहा हूँ, कुछ अच्छे बुनियादी वीडियोटेप के साथ, शायद वे आपको "स्थिति" (विज्ञापन नहीं) का अवलोकन करने में बहुत मदद कर सकते हैं!

मैं आपको सी में बदलने की सलाह देता हूं, बस सीखने के लिए, जैसा कि आप एक शौक़ीन हैं, यह एक खुशी होगी, समस्या नहीं।

मैं और सलाह देता हूं। दोनों भाषाओं में करें। आपके द्वारा खोजे जाने और उपयोग करने के तरीके और समाधान की तुलना करें। मुझे यकीन है कि यह "इतना आसान" नहीं होगा जैसा कि आप उम्मीद कर रहे हैं ... लेकिन यकीन है कि आप बहुत कुछ सीखेंगे!


1
बहुत बहुत धन्यवाद, लेकिन मैं नहीं सीख रहा हूं, मैं पहले से ही सी और सी ++ जानता हूं, मैं पूछ रहा हूं कि इस विशिष्ट परियोजना के लिए कौन सा उपयोग करना है।
पेत्रुजा

उफ़, मेरा सीखने का समय! = P
H_7

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

-1

यहाँ पेशेवरों और विपक्ष C ++ बनाम C:

  1. C के पास जाने से चुने गए C ++ सबसेट के भीतर रहना आसान हो जाएगा, क्योंकि कंपाइलर तब त्रुटि देगा जब आप इसके बाहर जाते हैं। यदि मुख्य समस्या तय किए गए सबसेट के भीतर रहने के साथ है, तो इस विकल्प को चुना जाना चाहिए। (इसके लिए हमारे पास संकलक समर्थन क्यों नहीं है?)
  2. एक बार जब आप चुने हुए सी ++ फीचर सब्मिट के भीतर रह सकते हैं, तो अगली बात यह है कि कोड को तोड़ने वाले बुरे सम्मेलनों से छुटकारा पाने के लिए सबसेट को बदलने की कोशिश करें। इसके लिए संपूर्ण c ++ का उपयोग आवश्यक है।
  3. एक बार जब आप दोनों "सबसेट के अंदर रह रहे हैं" और "यह एक अच्छा सबसेट है", तो सी ++ सुविधाओं से बाहर जाएं, और आवश्यकताओं के बारे में सोचना शुरू करें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.