2009-03-23 9 views
19

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

मैं सी के साथ संघर्ष कर रहा हूं। मुझे प्रक्रियात्मक भाषा में चीजों को कैसे करना है।

एक अनुभवी सी प्रोग्रामर मदद कैसे मैं डिजाइन समय के दौरान मेरे कार्यक्रमों के बारे में सोचना चाहिए व्याख्या कर सकते हैं?

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

लेकिन सी में, वस्तुएं नहीं हैं। तो क्या मुझे अपनी कतार डेटा संरचना के सभी व्यवहारों को रेखांकित करना है?

क्या कोई मेरी मदद कर सकता है "इसे प्राप्त करें"?

संबंधित: what is the best way to plan and organize development of an application in c

उत्तर

30

लेकिन सी में, वस्तुएं नहीं हैं। तो मुझे अपनी कतार डेटा संरचना के सभी व्यवहारों को रेखांकित करना होगा?

सं

ऐसा करें।

  1. अपनी कक्षा को परिभाषित करें हालांकि आप ओओ डिजाइन करने में सहज महसूस करते हैं।

  2. अपनी कक्षा के गुणों को सी-भाषा संरचना के रूप में लिखें।

  3. उस स्ट्रक्चर पर चलने वाले सभी कार्यों के साथ उस हेडर फ़ाइल में उस स्ट्रक्चर को रखें। सुनिश्चित करें कि MyStruct * self इन सभी "विधि कार्यों" का पहला तर्क है।

  4. विधि कार्यों के शव के सभी के साथ एक सी मॉड्यूल लिखें।

सी में गरीब व्यक्ति का ओओ यह अच्छी तरह से काम करता है। बस आपको आवश्यक संरचना में सब कुछ डालने के बारे में अनुशासित होना चाहिए - सार्वजनिक और निजी आवृत्ति चर - सबकुछ।

आम तौर पर, पहले स्थान पर निजी चर रखने की कोशिश से बचें।आपके पास ओओ कंपाइलर की पूर्ण शक्ति नहीं है, इसलिए कम-मूल्य वाली सुविधाओं जैसे "निजी" या "संरक्षित" से परेशान न हों।

+0

अग्रणी अंडरस्कोर आरक्षित हैं और इसका उपयोग नहीं किया जाना चाहिए। –

+1

कैसे अपने एपीआई आप भी pimpl में बदलाव का उपयोग कर सकते निजी चर निर्धारित करने में परिभाषित किया गया है, या "चार आरक्षित [SOME_SIZE]" से/कास्टिंग है पर निर्भर करता है इसलिए उपयोगकर्ता नहीं कभी क्या निजी चर हैं देख सकते हैं। प्रमुख अंडरस्कोर से –

+1

@evan नाम केवल struct सदस्यों –

15

तुम अब भी सोच सकते हैं सी के साथ उन्मुख वस्तु

तुम सिर्फ एक struct और कार्यों कि कि struct का एक उदाहरण के लिए सूचक ले का एक सेट बनाने की जरूरत इसके पहले पैरामीटर के रूप में।

बहुरूपता के लिए, आप संरचना के आकार को संरचना के पहले सदस्य के रूप में पास कर सकते हैं, इसलिए आप इसे कैसे डालना चाहते हैं।

एक महान pdf of object oriented programming with ANSI-C here नहीं है।

17

मैं एक opaque pointer उपयोग करने के लिए struct के सदस्यों में से डेटा छुपा प्रदर्शन करने के लिए एस लोट के जवाब में संशोधन होगा: लेकिन आप सामान्य OO डिजाइन का उपयोग करना चाहता हूँ

  1. अपने वर्ग को परिभाषित करें।
  2. आपकी कक्षा के सदस्य चर एक सी भाषा संरचना में जाते हैं।
  3. हेडर फ़ाइल में, आप अपनी ऑब्जेक्ट के सदस्य चर का पर्दाफाश नहीं करना चाहते हैं (क्योंकि ये ओओ भाषा में "निजी" होंगे)। इसके बजाय, एक अपारदर्शी सूचक का उपयोग करें, यानी
    typedef struct mystruct_s *mystruct_t; // first argument to all your methods
  4. सभी विधियों के लिए आप "सार्वजनिक" होना चाहते हैं, अपने हस्ताक्षर अपनी .h फ़ाइल में रखें। विधि निकायों को .c फ़ाइल में जाना चाहिए, और "निजी" विधियों को केवल .c फ़ाइल में परिभाषित किया जाना चाहिए और स्थैतिक घोषित किया जाना चाहिए ताकि उनके प्रतीक अन्य फ़ाइलों में परिभाषित प्रतीकों के साथ टकराव न करें।

अंडरस्कोर जैसे चालाक नामकरण सम्मेलन इस विधि का उपयोग करके अनावश्यक हैं, लेकिन इसका मतलब है कि आपके सभी सदस्य चर निजी होंगे। कार्य, सार्वजनिक या निजी हो सकता है, हालांकि सार्वजनिक कार्यों वे एक वैश्विक नाम स्थान ताकि आप mystruct_push(), mystruct_pop() की तरह एक "पैकेज" नाम के साथ उनके नाम अर्हता प्राप्त करने के लिए चाहते हो सकता का हिस्सा हैं, आदि

तुम भी यह स्पष्ट करता है, तो बनाने की जरूरत है कॉलर या लाइब्रेरी malloc() और free() पर कॉल करने के लिए ज़िम्मेदार है। सबसे अधिक संभावना है कि आपके पास mystruct_t *create() और void destroy(mystruct_t *target) विधियां होंगी।

+0

मैं सहमत हूं; मैंने एस लॉट के जवाब को वोट दिया था, लेकिन मेरा वोट इस पर ले जाया क्योंकि संरचना की सामग्री को छिपाने का सबसे अच्छा तरीका है - मैंने वास्तव में यह कई बार किया है और यह * वास्तव में * अच्छी तरह से काम करता है। –

0

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

वैसे, आप opaque pointers का उपयोग करके अपने structs के सदस्यों को निजी रखने के लिए लागू कर सकते हैं। मुझे याद है कि जीएनयू प्रोग्रामिंग मानकों और सिफारिशों में मूल रूप से शून्य के लिए सब कुछ कास्टिंग करके इसे करने के लिए एक तकनीक शामिल थी * जब इसे पारित किया गया था, तो टाइप किए गए प्रत्येक विशिष्ट प्रकार के अपारदर्शी सूचक का नाम देने के लिए टाइपपीफ का उपयोग करना था। (यानी, प्रत्येक "कक्षा")

2

Lua C api देखें। जहां तक ​​सी इंटरफ़ेस डिज़ाइन चला जाता है, यह मेरा मार्गदर्शक प्रकाश रहा है। प्रत्येक कार्य एक लुआ राज्य को एक अग्रणी तर्क के रूप में लेता है जो आपका "यह" बन जाता है। विरासत एक छोटा सा चालक है लेकिन Chipmunk एक सामान्य अच्छा काम करने वाले कार्यों को उजागर करने के लिए एक बहुत अच्छा काम करने का प्रबंधन करता है जो कि सामान्य आकार के structs लेता है और वास्तव में "क्लैस" के माध्यम से कौन सा फ़ंक्शन वास्तव में बुलाया जाता है, इसका विवरण तैयार करता है। जब आप ओओ में अधिभारित करेंगे, तो आप अक्सर अलग-अलग प्रकार (structs) ले जाने के लिए शून्य * का उपयोग कर सकते हैं। यह कभी-कभी थोड़ा सा हैकिश महसूस कर सकता है लेकिन अच्छी तरह से काम करता है।

4

मेरे पास प्रक्रियात्मक से लेकर ओओ सोचने के लिए एक समय का भालू था, इसलिए मुझे आपका दर्द महसूस होता है।

मैंने पाया कि वस्तुओं को बनाने के तरीके सीखने के लिए, यह सोचने के लिए सबसे अच्छा था कि वे कॉलर को कैसे देखेंगे। वही दृष्टिकोण आपको दूसरी तरफ जाने में मदद कर सकता है। विचार करें कि आपके घटक का एपीआई कैसा दिखता है। मौजूदा सी एपीआई का अध्ययन करना एक अच्छा तरीका है (मैंने ओओ एपीआई के उदाहरणों के सेट के रूप में मानक जावा एपीआई का उपयोग किया)।

आप इस तरह एक कतार घटक कुछ का उपयोग कर की आदत हो:

import some.package.Queue; 

Queue q = new Queue(); 
q.add(item); 

एक ठेठ सी एपीआई में, आप उम्मीद थी कुछ अधिक की तरह:

#include <queue.h> // provides queue, make_queue(), queue_add(), others 

queue q = make_queue(); // queue is probably a struct, or a struct* 
queue_add(q,item); 

सोच जब भी आप मिल वस्तुओं में, एक समान परिवर्तन करें।

आप सी में ऑब्जेक्ट जैसी संरचनाओं को बनाने के लिए पॉइंटर्स का उपयोग कर सकते हैं और जैसे, लेकिन हजारों सी प्रोग्रामर बिना प्रबंधित किए हैं।

गुड लक!

1

मूल रूप से सी ++ सिर्फ एक संकलक था कि सी ++ स्रोतों से सी कोड लिखा है, उनको देशी सी कंपाइलर, लिंक्ड इत्यादि द्वारा संकलित किया गया था।

इसलिए, सभी ओओपी विधियां सी में उपलब्ध हैं - यह सिर्फ इतना है कि संकलक आपकी मदद नहीं करेगा, और सभी संकलन-समय क्षमताओं को प्रदान नहीं करता है इस तरह के टेम्पलेट्स, ऑपरेटर ओवरराइड, डेटा छुपा, आदि के रूप

  1. सी ++ "struct" (शायद अभी भी है) सभी सदस्यों "सार्वजनिक" के साथ एक "वर्ग" के बराबर था।
  2. सदस्य कार्यों को संरचना में फ़ंक्शन पॉइंटर्स के रूप में कार्यान्वित किया जा सकता है; यह encapsulation और polymorphism प्रदान कर सकते हैं। जब तक आप कारखानों का उपयोग नहीं कर रहे हैं, तब तक वैश्विक दायरे में रचनाकार मौजूद हैं। विनाशक सदस्य कार्य हो सकते हैं।
  3. का उपयोग एक्सेसर सदस्य काम करता है, getColor की तरह(), setColor() आंतरिक मतभेदों को कम और कुछ डेटा छुपा प्रदान कर सकते हैं। यदि आप वास्तव में चाहते हैं, तो आप ब्रायन बॉंडी के मैक्रोज़ के साथ छिपाने के सुझाव का उपयोग कर सकते हैं।
  4. रहे हैं वास्तव में FOSS पुस्तकालयों कि मानक कंटेनर प्रदान का एक बहुत - आदि हैश टेबल, गतिशील सरणियों, लिंक किए गए सूची,
संबंधित मुद्दे