मुझे पता है कि क्लास पदानुक्रम में "क्रॉस-कास्ट" करने के लिए dynamic_cast
का उपयोग करना कानूनी है। उदाहरण के लिए, इस तरह दिखेगा कि अगर मैं श्रेणियां होती हैं:जांच कर रहा है कि एक क्रॉस-कास्ट संभवतः काम कर सकता है या नहीं?
A B
\/
C
अगर मैं एक A*
सूचक है कि प्रकार C
की एक वस्तु की ओर इंगित करता रहा है, तो मैं
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
उपयोग कर सकते हैं करने के लिए एक सूचक प्राप्त करने के लिए B
C
का मूल उद्देश्य मैं इंगित कर रहा हूं।
कारण मैं यह उल्लेख है कि समय है कि मैं इसके बाद के संस्करण कोड लिखने पर, यह संभव है कि संकलक अभी तक C
की परिभाषा भले ही यह A
और B
देखा है नहीं देखा गया है। इसका अर्थ यह है कि यह संभव है कि संकलक A
और B
के बीच किसी भी प्रकार के कनेक्शन का पता नहीं लगाता है, लेकिन इसे अभी भी कोड को संकलित करना है क्योंकि किसी भी परिस्थिति में सफल होने के लिए C
जैसे वर्ग और dynamic_cast
के लिए यह संभव है।
समस्या यह है कि इसका मतलब है कि मैं गलती से गलत प्रकार की वस्तु को पार कर सकता हूं। मान लीजिए मैं वर्गों है कि इस तरह लग रहे है:
A B D
\/
C
यहाँ, D
कुछ यादृच्छिक असंबंधित वर्ग है।
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
फिर इस dynamic_cast
हमेशा की तरह, कार्यावधि में असफल हो जायेगी वहाँ के बाद से A
और D
कनेक्ट करने के लिए कोई संभव तरीका नहीं: मैं कुछ इस तरह लिखने की कोशिश है। अगर मैं D
गलती से उपयोग कर रहा हूं क्योंकि मेरा मतलब B
का उपयोग करना था, तो संकलक मुझे कोई संकेत नहीं देगा कि मेरे पास एक अर्थहीन कलाकार है।
मेरा प्रश्न है: क्या कोई तरीका है कि मैं संकलक को चेतावनी दे सकता हूं कि कलाकार हमेशा रनटाइम पर असफल रहेगा? मैं किसी भाषा-स्तरीय समाधान या किसी भी बड़े कंपाइलर के लिए कुछ कंपाइलर सेटिंग से खुश हूं जो इसका पता लगा सकता है। यदि कोई बाहरी उपकरण है, तो यह भी ठीक है; मैं सिर्फ यह जानना चाहता हूं कि त्रुटियों के इस वर्ग को पकड़ना संभव है या नहीं।
यह निश्चित रूप से लिंकर स्तर होना चाहिए? संकलन समय पर, आप नहीं जानते कि एक वर्ग बनाया जा सकता है जो 'ए' और' डी' से प्राप्त होता है? – Keith
@ कीथ- निश्चित रूप से, जब तक कि आपके पास सर्वज्ञानी संकलक नहीं है। मैन, मैं उनमें से एक चाहता हूं ... :-) – templatetypedef
@ किथ: यहां तक कि मेरे उत्तर में समझाए गए लिंकर को सभी प्रकार के बारे में पूरी जानकारी नहीं हो सकती है। –