5

मैं विजुअल स्टूडियो 2005 प्रोफेसरियल संस्करण का उपयोग कर रहा हूं।सी ++ टाइपिड ऑपरेटर

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

typeid(SomeClass).raw_name() // the value of this is "[email protected]@" 
typeid(SomeClass).name()   /// "class SomeClass" 

SomeClass obj; 
typeid(obj).raw_name(); // "[email protected]@" 
typeid(obj).name();  // "class TLomeClass" 
+2

0% पहलू दर। इसका जवाब नहीं दे रहा है। विशेष रूप से मुझे पता चला कि मैंने पहले से ही आपके प्रश्नों में से एक का जवाब दिया है। :-) –

+0

क्या प्रश्न :) – user152508

+0

जिन प्रश्नों को मैंने देखा उनमें हल किया गया - आपके प्रश्नों के सबसे उपयोगी उत्तर को स्वीकार करने के लिए चेक मार्क का उपयोग करें। –

उत्तर

2

क्या आपके प्रश्न में कोड आपके कोड में समान है या कोड के समान है?

ऑपरेटर typeid, जब यह बहुरूपी प्रकार के लिए लागू किया जाता है, type_info उद्देश्य यह है कि गतिशील बहुरूपी वस्तु प्रकार को पहचानने देता है। तो, उदाहरण के लिए, आप typeid प्रकार Base & (जहां Base बहुरूपी है) के लिए एक संदर्भ है, जो वास्तव प्रकार Derived (जहां DerivedBase से ली गई है) का एक उद्देश्य के लिए बाध्य है के लिए लागू होते हैं, type_info वस्तु typeid द्वारा लौटाए के अनुरूप होगा Derived कक्षा, Base कक्षा में नहीं। क्या ऐसा हो सकता है कि ऐसा कुछ आपके कोड में हो रहा है?

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

पीएस वर्तमान में स्वीकृत उत्तर में जो कहा गया है उसके विपरीत, typeid पूरी तरह से और पूरी तरह मानक सी ++ सुविधा है। यह एक कंपाइलर एक्सटेंशन नहीं है।

+0

हाँ, आप सही हैं। मेरे उदाहरण में मेरे पास एक लाइब्रेरी फ़ंक्शन था जो बेस पॉइंटर लौटाता है जो व्युत्पन्न क्लास ऑब्जेक्ट को इंगित करता है। हालांकि, फ़ंक्शन का हस्ताक्षर बेस * फ़ंक्शन() था, और लाइब्रेरी प्रलेखन में बेस क्लास पत्ती वर्ग के रूप में दिखाई देता था, i.e से कक्षाओं को प्राप्त करने के लिए निर्दिष्ट नहीं किया गया था। लेकिन मुझे ऐसा लगता है कि यह कार्य वास्तव में एक सूचक को वापस कर रहा था जो अधिक व्युत्पन्न वर्ग को इंगित करता है जिसे मुक्ति दस्तावेज में नहीं कहा जाता है। I. अगर मैं यह कहता हूं: बेस बेस ओबीजे; आधार * basePtr = fucntion(); तो निम्न कथन सत्य है टाइपऑफ (बेसओबीजे)! = टाइपऑफ (* बेसपीआरटी) – user152508

1

इस व्यवहार का कारण कहीं कहीं on MSDN दस्तावेज किया गया है। इस विशेष मामले में आप जो विशिष्ट व्यवहार देख रहे हैं वह शायद विरासत के कुछ उपयोग, या कुछ कंपाइलर एक्सटेंशन के कारण है, जिसे डीएलएल के विक्रेता द्वारा दस्तावेज नहीं किया गया है।

ऑपरेटर का व्यवहार सी ++ मानक द्वारा परिभाषित नहीं किया गया है, और जैसा कि एक कंपाइलर एक्सटेंशन है। आप अपने व्यवहार पर भरोसा नहीं कर सकते हैं, न ही आपको यह पता लगाने की कोई उचित उम्मीद हो सकती है कि यह ऐसा क्यों करता है जो ऐसा करता है, जब तक यह विक्रेता द्वारा स्पष्ट रूप से दस्तावेज नहीं किया जाता है। इसका व्यवहार वीएस -2008 में बदल सकता है, और संभवतः वीएस2003 से अलग है। (यह निश्चित रूप से जीसीसी, आईसीसी और विभिन्न अन्य कंपाइलर्स से अलग है।)

+0

आपके उत्तर के लिए धन्यवाद। यह मुझे बहुत मदद करता है। असल में, कुछ जांच के बाद, मैं निष्कर्ष निकाला कि विक्रेता के पास विशेष वर्ग के कुछ अनियंत्रित वायदा हैं। – user152508

+0

मुझे खेद है: क्या? !!! ऑपरेटर 'टाइपिड' स्पष्ट रूप से और स्पष्ट रूप से सी ++ मानक द्वारा परिभाषित किया गया है। यह एक कंपाइलर एक्सटेंशन नहीं है। – AnT

+0

हां, टाइपिड मानक में 8 परिभाषित * है, लेकिन इसका * व्यवहार * नहीं है। एकमात्र स्पष्ट आवश्यकता यह है कि: 'टाइपनाम ए ए 1, ए 2; जोर दें (टाइपोफ (ए 1) == टाइपऑफ (ए 2)); 'इसके अलावा, मेरे पढ़ने के द्वारा, कुछ भी एक एक्सटेंशन है। – greyfade

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