मैं एक उदाहरण के लिए एक सूचक के बारे में बात नहीं कर रहा हूं, मैं एक वर्ग के लिए एक सूचक चाहता हूं।सी ++ में आप एक फंक्शन के लिए एक पॉइंटर हो सकते हैं, क्या आपके पास कक्षा में पॉइंटर भी हो सकता है?
सी ++ में आप एक फंक्शन के लिए एक पॉइंटर हो सकते हैं, क्या आपके पास कक्षा में पॉइंटर भी हो सकता है?
उत्तर
सी ++ में, कक्षाएं "first class objects" नहीं हैं। आप जो निकटतम प्राप्त कर सकते हैं वह type_info
उदाहरण के लिए एक सूचक है।
नहीं। पॉइंटर रन-टाइम पर कंप्यूटर की स्मृति में कुछ का पता है। एक वर्ग सिर्फ कंपाइलर को निर्देशों का एक सेट है।
हां और नहीं। यह आपके संदर्भ के आधार पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। यदि आप बस पर पॉइंटर चाहते हैं तो टाइप करें तो कोई रास्ता नहीं है। टाइप पॉइंटर की भावना में स्मृति में नहीं रहता है।
कारण मैंने हां कहा हालांकि कुछ लोग आभासी तालिका को एक प्रकार के सूचक पर विचार करेंगे। वर्चुअल टेबल मेमोरी में मौजूद होने के बाद से यह पॉइंटर प्राप्त करना संभव है और कुछ ट्रिकरी के साथ आभासी तरीकों का आह्वान करने के लिए इसका उपयोग किया जा सकता है।
इसके साथ एक छोटी सी समस्या है: एकाधिक विरासत का उपयोग करते समय एक वर्ग में एकाधिक वर्चुअल टेबल हो सकते हैं। साथ ही, यदि कोई वर्ग किसी अन्य से विरासत में आता है लेकिन किसी वर्चुअल विधियों को नहीं बदलता है, तो मेरा मानना है कि संकलक दोनों कक्षाओं के आभासी तालिकाओं को विलय करने से रोकता है। – CesarB
सच है लेकिन आप अभी भी इसके लिए एक सूचक प्राप्त कर सकते हैं। निजी तौर पर मैं इसे एक प्रकार के सूचक पर नहीं मानता लेकिन बहुत से लोग ऐसा करते हैं, मैंने सोचा कि मैं इसे पूर्णता – JaredPar
वास्तविक ऑब्जेक्ट-आधारित भाषाओं के विपरीत, कक्षा कक्षा + + में कोई वस्तु नहीं है, और अधिक दयालुता है। निकटतम आप "पॉइंटर टू क्लास" में आ सकते हैं आरटीटीआई:
const std :: type_info & जानकारी = टाइपिड (ऑब्जेक्ट एक्सप्रेशन);
type_info का नाम() सदस्य समापन है, और उनकी तुलना एक-दूसरे से की जा सकती है।
के लिए पोस्ट करूंगा, जहां वे वस्तुएं हैं जहां मैं ऑब्जेक्ट कर सकता हूं, उस वस्तु का प्रकार एक वस्तु है (नहीं ऑब्जेक्ट प्रकार का प्रतिनिधित्व करता है और न ही किसी प्रकार के कारखाने के लिए कहा जाता है लेकिन वास्तव में यह कहां है)? –
जिसे मैं निश्चित रूप से जानता हूं वह स्मॉलटाक है। जावा getClass() के साथ ऐसा करने का प्रयास करता है, लेकिन यह असंगत है। – Arkadiy
@arkadly प्रतिबिंब (getClass) आप जो वर्णन करते हैं उससे बहुत अलग है। प्रतिबिंब के साथ आप एक प्रकार के बारे में मेटा डेटा का प्रतिनिधित्व करने के लिए एक प्रक्षेपण है। (एक प्रकार एक रनटाइम चीज है जो कक्षा एक संकलित समय की बात है, कम से कम सी ++/जावा/सी # एट अल में)। स्मॉलटाक आप वहां पर सही हो सकते हैं, हालांकि मुझे याद है कि ऑब्जेक्ट का प्रतिनिधित्व करने वाले वर्ग की तुलना में यह कक्षा के लिए एक संकलन है। स्मॉलटॉक ऑब्जेक्ट आधारित क्लास आधारित नहीं है (जैसा क्लास आधारित सी ++ के लिए आरोपित है) –
एक "कक्षा" मौजूद नहीं है। एकमात्र चीज जिसे आप इंगित कर सकते हैं वह डेटा है।
शेष "कक्षा" वास्तव में एक प्रेषण तालिका है। कक्षा में प्रत्येक विधि के लिए, प्रेषण तालिका में एक सूचक होता है। इस तरह, वर्ग आपकी कक्षा की सही विधि को इंगित करता है चाहे वह किस प्रकार का वर्तमान में डाला गया हो। यह उपयोग करने के लिए बेकार होगा।
आपकी कक्षा के तरीके (प्रेषण तालिका द्वारा इंगित चीजें) वास्तव में केवल "कार्य" हैं जो आपके क्लास डेटा पॉइंटर में पास की जाती हैं। किसी विधि की परिभाषा बहुत अधिक है कि यह एक ऐसा फ़ंक्शन है जो कक्षा डेटा को पैरामीटर के रूप में लेता है। अधिकांश सी-स्टाइल भाषाओं में, वह डेटा पॉइंटर छुपाया जाता है लेकिन इसे "यह" कहा जाता है।
आपकी कक्षा के लिए विधियां कोडबेस पर फैली हो सकती हैं। माता-पिता वर्गों के कारण, आप शायद इन तरीकों को एक दूसरे के समीप ढूंढने की संभावना नहीं रखते हैं।
जैसा कि हर किसी ने पहले ही कहा है, कक्षा में पॉइंटर होना संभव नहीं है।
लेकिन यदि बिंदु रनटाइम पर चुने गए कुछ वर्ग से नया उदाहरण बनाना है, तो आप फैक्टरी विधि (या सार फैक्ट्री) डिज़ाइन पैटर्न को देखना चाहेंगे।
आपके पास कक्षा में (रन-टाइम) पॉइंटर नहीं हो सकता है, लेकिन सी ++ में समान संकलन-समय अवधारणा है: template parameters। Boost में library कक्षाओं के बारे में जानकारी प्राप्त करने के लिए उन्हें traits लाइब्रेरी में हेरफेर करने के लिए समर्पित है।
पॉइंटर्स के बारे में आप कैसे सोचना चाहते हैं, इस पर निर्भर करते हुए, यदि आप पॉइंटर द्वारा कुछ अभिन्न मूल्य का मतलब रखते हैं, तो आपके पास कक्षा में "सूचक" हो सकता है। बूस्ट आपको प्रकारों को पंजीकृत करने और आपके द्वारा पंजीकृत हर प्रकार के लिए एक अद्वितीय पूर्णांक असाइन करने की अनुमति देता है।यदि आप जिन प्रकारों को पंजीकृत कर रहे हैं वे सभी वर्ग हैं तो आप उस प्रकार के ऑब्जेक्ट को बनाने के लिए आवश्यक कोड को रन-टाइम पर देख सकते हैं, जब तक आपके पास इच्छित प्रकार का मूल्य हो। लेकिन सामान्य रूप से, कक्षाएं भाषा में प्रथम श्रेणी की वस्तुएं नहीं होतीं और सबसे अच्छा आप उम्मीद कर सकते हैं कि आप जिस व्यवहार को चाहते हैं उसका अनुकरण करना है।
सच है, सी ++ में निर्मित प्रतिबिंब/आत्मनिरीक्षण के लिए कोई समर्थन नहीं है, लेकिन कई पुस्तकालय हैं जो जावा की कक्षा कार्यक्षमता जैसे कई जोड़ देंगे, और प्रोग्रामर को कक्षा का प्रतिनिधित्व करने वाली ऑब्जेक्ट प्राप्त करने की अनुमति देंगी एक उदाहरण, आदि गूगल सी ++ प्रतिबिंब।
- 1. एक तर्क के रूप में फंक्शन पॉइंटर
- 2. फंक्शन पॉइंटर जो एक फ़ंक्शन पॉइंटर
- 3. सी ++ सदस्य फंक्शन के लिए कॉल पॉइंटर
- 4. सी ++ पासिंग पॉइंटर टू फंक्शन (हाउटो) + सी ++ पॉइंटर मैनिपुलेशन
- 5. सी ++ 11 लम्बाडा फंक्शन पॉइंटर
- 6. क्या कक्षा में वर्चुअल डेटा सदस्य हो सकते हैं?
- 7. एक मशीन में हमारे पास कितने JVM हो सकते हैं?
- 8. कक्षा के बिना सी # में अकेले खड़े हो सकते हैं?
- 9. मैं एक पॉइंटर को कैसे संशोधित करूं जो सी में किसी फ़ंक्शन में पास हो गया हो?
- 10. फंक्शन पॉइंटर __attribute __ ((कॉन्स)) फ़ंक्शन?
- 11. क्या static_cast एक नल पॉइंटर को एक नल पॉइंटर में बदल सकता है?
- 12. क्या आपके पास एक ही प्रोग्राम में एकाधिक पिक्सेल (खंड) शेडर्स हो सकते हैं?
- 13. क्या आप फंक्शन तर्कों में एक सरणी लगा सकते हैं?
- 14. सी ++/सीएलआई प्रतिनिधि फंक्शन पॉइंटर (System.AccessViolationException)
- 15. सी में फंक्शन पॉइंटर कानूनी/परिभाषित के माध्यम से अतिरिक्त पैरामीटर पास कर रहा है?
- 16. एक MySQL तालिका में आपके पास कितने कॉलम (अधिकतम) हो सकते हैं?
- 17. सी और सी ++ में एक कॉन्स्ट पॉइंटर-टू-पॉइंटर का क्या अर्थ है?
- 18. ऑब्जेक्ट्स के लिए सी ++ पॉइंटर
- 19. सी ++: एक बेस क्लास पॉइंटर
- 20. क्या आपके पास बहुत सारे आवेषण हो सकते हैं (पायथन में)?
- 21. क्या आपके पास एक एसएफटीपी सर्वर का उपयोग कर वर्चुअल उपयोगकर्ता हो सकते हैं?
- 22. क्या आप एक कक्षा में दो कक्षाएं बढ़ा सकते हैं?
- 23. डब्ल्यूपीएफ: क्या एक दृश्य में बच्चे हो सकते हैं?
- 24. क्या हमारे पास एक शर्त में असाइनमेंट हो सकता है?
- 25. क्या आपके पास लिस्प में हैश टेबल हो सकती है?
- 26. एक पॉइंटर से आधार तक एक पॉइंटर से "अमान्य" व्युत्पन्न करने के लिए static_cast क्यों है?
- 27. क्या मॉड्यूल में गुण हो सकते हैं?
- 28. जीसीसी के साथ फंक्शन पॉइंटर, एक पता सौंपा
- 29. सी में, क्या यह कभी भी सीमित तर्क के साथ एक फ़ंक्शन पॉइंटर में एक वैरैडिक फ़ंक्शन पॉइंटर डालने के लिए सुरक्षित है?
- 30. क्या आपके पास चुनिंदा क्षेत्र में एकाधिक फ़ॉन्ट रंग हो सकते हैं?
यदि यह भी संभव था, जो यह नहीं है, तो कक्षा में एक सूचक भी कितना अच्छा होगा? –
@ जिम बक: इसे कक्षा के नए उदाहरणों को तुरंत शुरू करने, इसके सदस्यों को ढूंढने और जावा में अन्य सभी मजेदार सामान java.lang.Class के साथ करने के लिए इसका उपयोग करके इसे पास कर रहा है। – CesarB
आह, हाँ, आपको प्रतिबिंब की आवश्यकता होगी जो सी ++ में भी मौजूद नहीं है। –