2008-11-13 4 views
7

मैं एक उदाहरण के लिए एक सूचक के बारे में बात नहीं कर रहा हूं, मैं एक वर्ग के लिए एक सूचक चाहता हूं।सी ++ में आप एक फंक्शन के लिए एक पॉइंटर हो सकते हैं, क्या आपके पास कक्षा में पॉइंटर भी हो सकता है?

+0

यदि यह भी संभव था, जो यह नहीं है, तो कक्षा में एक सूचक भी कितना अच्छा होगा? –

+0

@ जिम बक: इसे कक्षा के नए उदाहरणों को तुरंत शुरू करने, इसके सदस्यों को ढूंढने और जावा में अन्य सभी मजेदार सामान java.lang.Class के साथ करने के लिए इसका उपयोग करके इसे पास कर रहा है। – CesarB

+0

आह, हाँ, आपको प्रतिबिंब की आवश्यकता होगी जो सी ++ में भी मौजूद नहीं है। –

उत्तर

17

सी ++ में, कक्षाएं "first class objects" नहीं हैं। आप जो निकटतम प्राप्त कर सकते हैं वह type_info उदाहरण के लिए एक सूचक है।

5

नहीं। पॉइंटर रन-टाइम पर कंप्यूटर की स्मृति में कुछ का पता है। एक वर्ग सिर्फ कंपाइलर को निर्देशों का एक सेट है।

1

हां और नहीं। यह आपके संदर्भ के आधार पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। यदि आप बस पर पॉइंटर चाहते हैं तो टाइप करें तो कोई रास्ता नहीं है। टाइप पॉइंटर की भावना में स्मृति में नहीं रहता है।

कारण मैंने हां कहा हालांकि कुछ लोग आभासी तालिका को एक प्रकार के सूचक पर विचार करेंगे। वर्चुअल टेबल मेमोरी में मौजूद होने के बाद से यह पॉइंटर प्राप्त करना संभव है और कुछ ट्रिकरी के साथ आभासी तरीकों का आह्वान करने के लिए इसका उपयोग किया जा सकता है।

+0

इसके साथ एक छोटी सी समस्या है: एकाधिक विरासत का उपयोग करते समय एक वर्ग में एकाधिक वर्चुअल टेबल हो सकते हैं। साथ ही, यदि कोई वर्ग किसी अन्य से विरासत में आता है लेकिन किसी वर्चुअल विधियों को नहीं बदलता है, तो मेरा मानना ​​है कि संकलक दोनों कक्षाओं के आभासी तालिकाओं को विलय करने से रोकता है। – CesarB

+0

सच है लेकिन आप अभी भी इसके लिए एक सूचक प्राप्त कर सकते हैं। निजी तौर पर मैं इसे एक प्रकार के सूचक पर नहीं मानता लेकिन बहुत से लोग ऐसा करते हैं, मैंने सोचा कि मैं इसे पूर्णता – JaredPar

1

वास्तविक ऑब्जेक्ट-आधारित भाषाओं के विपरीत, कक्षा कक्षा + + में कोई वस्तु नहीं है, और अधिक दयालुता है। निकटतम आप "पॉइंटर टू क्लास" में आ सकते हैं आरटीटीआई:

const std :: type_info & जानकारी = टाइपिड (ऑब्जेक्ट एक्सप्रेशन);

type_info का नाम() सदस्य समापन है, और उनकी तुलना एक-दूसरे से की जा सकती है।

+0

के लिए पोस्ट करूंगा, जहां वे वस्तुएं हैं जहां मैं ऑब्जेक्ट कर सकता हूं, उस वस्तु का प्रकार एक वस्तु है (नहीं ऑब्जेक्ट प्रकार का प्रतिनिधित्व करता है और न ही किसी प्रकार के कारखाने के लिए कहा जाता है लेकिन वास्तव में यह कहां है)? –

+0

जिसे मैं निश्चित रूप से जानता हूं वह स्मॉलटाक है। जावा getClass() के साथ ऐसा करने का प्रयास करता है, लेकिन यह असंगत है। – Arkadiy

+0

@arkadly प्रतिबिंब (getClass) आप जो वर्णन करते हैं उससे बहुत अलग है। प्रतिबिंब के साथ आप एक प्रकार के बारे में मेटा डेटा का प्रतिनिधित्व करने के लिए एक प्रक्षेपण है। (एक प्रकार एक रनटाइम चीज है जो कक्षा एक संकलित समय की बात है, कम से कम सी ++/जावा/सी # एट अल में)। स्मॉलटाक आप वहां पर सही हो सकते हैं, हालांकि मुझे याद है कि ऑब्जेक्ट का प्रतिनिधित्व करने वाले वर्ग की तुलना में यह कक्षा के लिए एक संकलन है। स्मॉलटॉक ऑब्जेक्ट आधारित क्लास आधारित नहीं है (जैसा क्लास आधारित सी ++ के लिए आरोपित है) –

1

एक "कक्षा" मौजूद नहीं है। एकमात्र चीज जिसे आप इंगित कर सकते हैं वह डेटा है।

शेष "कक्षा" वास्तव में एक प्रेषण तालिका है। कक्षा में प्रत्येक विधि के लिए, प्रेषण तालिका में एक सूचक होता है। इस तरह, वर्ग आपकी कक्षा की सही विधि को इंगित करता है चाहे वह किस प्रकार का वर्तमान में डाला गया हो। यह उपयोग करने के लिए बेकार होगा।

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

आपकी कक्षा के लिए विधियां कोडबेस पर फैली हो सकती हैं। माता-पिता वर्गों के कारण, आप शायद इन तरीकों को एक दूसरे के समीप ढूंढने की संभावना नहीं रखते हैं।

4

जैसा कि हर किसी ने पहले ही कहा है, कक्षा में पॉइंटर होना संभव नहीं है।

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

1

आपके पास कक्षा में (रन-टाइम) पॉइंटर नहीं हो सकता है, लेकिन सी ++ में समान संकलन-समय अवधारणा है: template parametersBoost में library कक्षाओं के बारे में जानकारी प्राप्त करने के लिए उन्हें traits लाइब्रेरी में हेरफेर करने के लिए समर्पित है।

0

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

0

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

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