2012-08-14 14 views
5

संभव डुप्लिकेट:
Finding the type of an object in C++जांच की जा रही है, तो एक विशेष वर्ग सी ++ के लिए सूचक अंक

मैं संकेत पता चल सके कि वे एक विशेष व्युत्पन्न वर्ग के अनुरूप देख सकते हैं और लेने के लिए के साथ एक सवाल है आवश्यक कार्रवाई।

आइए कहें कि वर्तमान में मेरे पास 2 व्युत्पन्न कक्षाएं DerivedClass1 और DerivedClass2 और बेस क्लास BaseClass है। मैं निम्नलिखित कार्रवाई की जांच करना चाहता हूं।

Ptr<BaseClass> ptr;

if (ptr points to DerivedClass1) { action1 } बाकी { एक्शन 2 }

मैं किसी विशेष DerivedClass को ptr अंक के लिए जाँच करते हैं?

+2

नहीं, शायद आप * जानना चाहते हैं कि '* ptr' का गतिशील प्रकार क्या है। –

उत्तर

10

तो BaseClass बहुरूपी है (आभासी कार्यों में शामिल है), आप कर सकते हैं टेस्ट:

if (dynamic_cast<DerivedClass1*>(ptr.get())) 

लेकिन खोलना के रूप में पता चलता है, संभवतः एक आगंतुक पैटर्न, बात की इस तरह के लिए आम तौर पर आप गतिशील प्रेषण का उपयोग करना चाहिए। dynamic_cast के साथ अपना कोड लिटर करना इसे बनाए रखना मुश्किल बनाता है। मैं लगभग dynamic_cast लगभग कभी नहीं उपयोग करता हूं।

20

आपको लगता है करने के लिए थोड़ा और वस्तु orientedly थे, तो आप बस इसे आधार वर्ग पर एक आभासी विधि बनाना होगा:

Ptr<BaseClass> ptr; 

ptr->Action(); 

और प्रत्येक वर्ग इसे लागू रूप में की जरूरत है। मुझे एहसास है कि यह एक वास्तविक उत्तर नहीं है, लेकिन यह आपके लक्ष्य को पूरा करने का एक वैकल्पिक तरीका है जिसे अक्सर बेहतर माना जाता है, यही कारण है कि मुझे लगता है कि यह उल्लेखनीय है।

+0

धन्यवाद। यह मेरा प्रारंभिक विचार था, लेकिन मुझे किसी विशेष वर्ग में एक कॉन्स्ट विधि और किसी अन्य में एक गैर-कॉन्स होने की समस्या थी, इस प्रकार इस व्यवहार को एक नई विधि में जोड़ने की कोशिश कर रहा था। – lordlabakdas

4
if(dynamic_cast<DerivedClass1*>(ptr)) 
{ 
    // Points to DerivedClass1 
} 
else if(dynamic_cast<DerivedClass2*>(ptr) 
{ 
    // Pointes to DerivedClass2 
} 
+0

यदि कोई तीसरा स्तर था, तो कहें, 'DerivedClass1_1' और 'DerivedClass1_2', पहला' if' खंड उन्हें 'DerivedClass1' दोनों के रूप में व्यवहार करेगा - यह हो सकता है कि ओपी चाहता है या नहीं। –

+0

@ घटक 10 मैंने बस ओपी के प्रश्न का उत्तर दिया है। मैं इस अभ्यास को स्वीकार नहीं करता हूं, और आमतौर पर यह पता चलता है कि _bad डिज़ाइन निर्णय लेने के बाद ही इसकी आवश्यकता होती है। विरासत की स्थिति को इंगित करने के लिए धन्यवाद, हालांकि यदि ओपी इस तरह कुछ करने का फैसला करता है। – Aesthete

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