2010-02-25 13 views
8

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

उत्तर

24

विंडोज एपीआई सी, जो था और अभी भी प्रणाली प्रोग्रामिंग के लिए सबसे अधिक इस्तेमाल किया भाषा है के लिए डिजाइन किए गए थे; सी एपीआई सिस्टम एपीआई के लिए डी-फैक्टो मानक हैं, और इसके लिए लगभग सभी अन्य भाषाओं में बाहरी सी कार्यों को कॉल करने का कोई तरीका था, इसलिए सी एपीआई लिखना अन्य भाषाओं के साथ संगत होने में मदद करता है।

सी एपीआई सिर्फ इतना है कि लगभग सिर्फ परिभाषा बुला सम्मेलन कार्य (और संरचनाओं लेआउट के बारे में कुछ) के लिए उपयोग करने के लिए होते हैं एक सरल ABI, की जरूरत है। सी ++ और अन्य वस्तु उन्मुख भाषाओं, इसके विपरीत, एक जटिल ABI अपेक्षा करते हैं कि, कैसे विरासत को संभालने के लिए, कैसे vtable बाहर बिछाने के लिए परिभाषित करना होगा कैसे वस्तुओं स्मृति में बाहर रखी हैं, अपवाद प्रचार करने के लिए कैसे, कहाँ RTTI डेटा डाल करने के लिए, ... इसके अलावा सभी भाषाओं वस्तु उन्मुख होते हैं, और API का उपयोग ++ अन्य गैर वस्तु उन्मुख भाषाओं के साथ सी के लिए सोचा था कि एक असली दर्द हो सकता है (अगर तुम कभी से COM इस्तेमाल किया सी तुम्हें पता है मैं क्या मतलब है)।

एक अलग रूप में, जब विंडोज शुरू में तैयार किया गया है सी ++ पीसी पर इतने बड़े पैमाने पर नहीं था, और भी सी उपयोग नहीं किया गया तो ज्यादा था के रूप में: वास्तव में, विंडोज 3.11 और कई अनुप्रयोगों का एक बड़ा हिस्सा अभी भी विधानसभा में लिखा गया , क्योंकि युग में स्मृति और सीपीयू की बाधाएं बहुत तंग थीं; कंपाइलर्स अब भी कम स्मार्ट थे, खासकर सी ++ वाले। मशीनों पर जहां हाथ से बना असेंबली अक्सर एकमात्र समाधान था, सी ++ ओवरहेड वास्तव में अस्वीकार्य था।

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

हालांकि, विंडोज किसी भी तरह से ऑब्जेक्ट उन्मुख है (उदाहरण के लिए पूरी "विंडो क्लास" अवधारणा, या, गहरे स्तर पर, एनटी कर्नेल के आंतरिक कार्य, जो "वस्तु" पर आधारित है, अवधारणा), हालांकि इसके सबसे बुनियादी एपीआई, सरल सी कार्यों के रूप में, किसी भी तरह से इस ओओ प्रकृति को छुपाएं। दूसरी तरफ, खोल को कई सालों बाद डिजाइन किया जा रहा है, ज्यादातर सी ++ में लिखा गया है और यह वास्तव में ऑब्जेक्ट उन्मुख COM इंटरफ़ेस प्रदान करता है।

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

यदि आप सी ++ एपीआई के आधार पर सिस्टम में रुचि रखते हैं तो आपको Haiku पर एक नज़र डालें; व्यक्तिगत रूप से, यह उन पहलुओं में से एक है जिसके कारण मुझे उस परियोजना में काफी दिलचस्पी है।

वैसे, यदि आप केवल एपीआई के साथ Win32 प्रोग्रामिंग करने जा रहे हैं तो आपको इन "विशेषताओं" और अन्य Win32 मुहावरों के लिए उपयोग करने के लिए बेहतर किताब मिल जाएगी। दो प्रसिद्ध लोग Rector-Newcomer और Petzhold हैं।

+0

धन्यवाद। सभी प्रतिक्रियाओं से। यह अब बहुत अधिक समझ में आता है। – numerical25

+0

ग्रेट स्पष्टीकरण। एक सवाल हालांकि: यदि Win32 वास्तव में ऑब्जेक्ट उन्मुख है, तो WNDProc फ़ंक्शन में एक उदाहरण सूचक प्राप्त करना इतना कठिन क्यों है (तर्कसंगत रूप से पूरे एपीआई का दिल)? (सीएफ। http://www.codeguru.com/forum/printthread.php?t=234315) –

+0

@ जेरेड: Win32 एपीआई की अधिक या कम वस्तु-उन्मुख प्रकृति एक वैचारिक चीज है जिसमें कुछ भी नहीं है सी ++ प्रकार प्रणाली के साथ। विंडो कक्षाएं विंडो प्रबंधक की अवधारणा हैं, न कि विशिष्ट भाषा का उपयोग जो आप WM सुविधाओं तक पहुंचने के लिए कर रहे हैं। आप विंडो कक्षाओं/उदाहरणों के लिए सी ++ कक्षाओं/वस्तुओं के बीच एक पत्राचार बना सकते हैं, लेकिन सिद्धांत की रेखा में वे पूरी तरह से असंबंधित चीजें हैं। –

1

शायद क्योंकि Win32 API मुख्यधारा ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की तुलना में "पुराना" है, तो यह इसके कोर पर सी ++ एपीआई नहीं है।

5

Win32 को सी भाषा के साथ सी ++ के साथ काम करने के लिए डिज़ाइन किया गया था।
यही कारण है कि आप उदाहरण के लिए bool के बजाय परिभाषित BOOL के वापसी प्रकार देखेंगे।
bool सी के लिए विशिष्ट है ++ और सी

में मौजूद नहीं है के लिए माइक्रोसॉफ्ट के वस्तु उन्मुख Win32 का आवरण MFC देखते हैं।

तब से माइक्रोसॉफ्ट से एक नया ढांचा नेट फ्रेमवर्क है।
नेट फ्रेमवर्क प्रबंधित कोड पर आधारित है और मूल रूप से नहीं चलता है। विंडोज़ पर जीयूआई प्रोग्रामिंग करने का सबसे आधुनिक तरीका डब्ल्यूपीएफ या सिल्वरलाइट भी है।

अप्रबंधित जीयूआई प्रोग्रामिंग करने का सबसे आधुनिक तरीका अभी भी एमएफसी का उपयोग कर रहा है, हालांकि कुछ लोग अभी भी सीधे Win32 का उपयोग करना पसंद करते हैं।

पॉइंटर्स के साथ काम करना नोट सी के लिए विशिष्ट नहीं है, यह अभी भी सी ++ में बहुत आम है।

+2

MFC, जिस तरह से बहुत पुराना और बुरी तरह से तैयार किया गया है मैं इसे इस्तेमाल करने की सलाह नहीं होता ... – dimsuz

+1

@dpimka: पोस्टर Win32 के बारे में विशेष रूप से पूछ रहा है। एमएफसी Win32 से बहुत दूर नहीं है और उस संदर्भ में उल्लेखनीय है। –

+3

एमएफसी अभी भी Cof+ में विंडोज करने के लिए _official_ OO तरीका है, है ना? –

4

पहला कारण यह है कि आसपास के पॉइंटर्स सस्ता है। पॉइंटर्स x86 पर 4 बाइट्स और x64 पर 8 बाइट्स हैं। जबकि संरचना या वर्ग यह इंगित करता है कि स्मृति में पूरी तरह से कब्जा कर सकते हैं। तो एक वर्ग को तत्काल करने का अर्थ है बार-बार नई स्मृति को आरक्षित करना। यह गति और स्मृति खपत पीओवी से कुशल नहीं है।

ऑब्जेक्ट्स या स्मार्ट पॉइंटर्स या इसी तरह की संरचनाओं के संदर्भों को पारित करने का एक और तरीका है। लेकिन Win32 एपीआई सी युग में डिजाइन किया गया था, तो जहां यह अप करने के लिए अब है यह है;)

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

-3

पॉइंटर्स को समझने के लिए आप the CPlusPlus.com tutorial on pointers पढ़ना चाहेंगे।

+0

मैं पॉइंटर्स समझता हूं। मुझे अभी समझ में नहीं आया कि सी ने उनमें से कितने उपयोग किए। यदि कुछ भी है, तो WIN32 सिस्टम प्रोग्राम को समझने के संसाधन – numerical25

0

इसकी तरह लगभग आपको कई ओओ रैपरों में से एक को आजमाएं। एमएफसी या नेट की तरह।

+0

की मदद करेंगे। नेट Win32 wrapper नहीं है। –

+2

.NET क्या कर सकता है जो निम्न स्तर एपीआई – rerun

+1

में नहीं है, मैं मुख्य रूप से एक सी ++ डेवलपर हूं, लेकिन यहां तक ​​कि मैं यह भी स्वीकार कर सकता हूं कि नेट निर्विवाद रूप से तेज़ विकास और कम बग प्रवण कोड सक्षम करता है। बनाए रखने के लिए कम कच्चे कोड का उल्लेख नहीं है। –

0

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

7

क्योंकि Win32 एपीआई सादा सी, सी ++ नहीं पर लिखा है। तो लगभग किसी भी भाषा पर कोई भी प्रोग्राम उन एपीआई को कॉल कर सकता है।

इसके अलावा, वहाँ और विभिन्न भाषाओं विभिन्न मॉड्यूल भर में वस्तुओं का उपयोग करने के लिए सरल तंत्र, नहीं कर रहे हैं। अर्थात। आप सी ++ वर्ग को पायथन में निर्यात नहीं कर सकते हैं। बेशक, OLE/COM तरह technoligies कर रहे हैं, लेकिन वे अभी भी सादा सी पर लिखा और वे बिट का उपयोग करने के comlicated कर रहे हैं।

दूसरी ओर से कम - कॉल करने के लिए सादा सी कार्यों मानकीकृत कर रहे हैं। तो आप किसी भी भाषा में डीएलएल या स्थैतिक lib से रूटीन कॉल कर सकते हैं।

0
  • सी के रूप में सी कार्य करने के कारण सी और सी ++ प्रोग्रामर दोनों इसका उपयोग करते हैं।
  • विंडोज एपीआई रास्ता वापस चला जाता है - सी उन दिनों के दौरान प्रसिद्ध था।

सभी एचडब्ल्यूएनडी, हैंडल, एचडीसी क्लैंप किए गए, वस्तुओं जैसे डेटा प्रकारों (struct का उपयोग करके) कमजोर प्रयास हैं। सी एफएक्यू के इस पर एक सवाल है ->http://c-faq.com/struct/oop.html

+2

सी कार्य करने से Win32 को कॉल करने के लिए पाइथन, हास्केल और सी # सहित अधिकांश भाषाओं की अनुमति मिलती है। :) – Macke

+0

+1 अन्य लैंग्स के बारे में भी उल्लेख करने के लिए, सी में जेबीसी है जब यह एबीआई की बात आती है :) – legends2k

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

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