2012-08-14 32 views
5

Olası Çoğalt:
Finding the type of an object in C++Denetleme eğer belirli bir sınıf C++ bir işaretçi işaret

onlar belirli türetilmiş sınıfa uygun olmadığını görmek ve almak için işaretçiler kontrol ile bir sorum var gerekli eylem.

Şu anda 2 türetilmiş sınıf DerivedClass1 ve DerivedClass2 ve BaseClass taban sınıfına sahip olduğumu söyleyelim. Aşağıdaki eylemi kontrol etmek istiyorum. Başka } { action2 }

nasıl belli DerivedClass'dan için ptr puan için kontrol ederim action1

Ptr<BaseClass> ptr;

if (ptr points to DerivedClass1) { ? Eğer biraz daha nesne orientedly düşünmeye olsaydı

+2

Hayır, büyük olasılıkla * yok * * dinamik türün ne olduğunu bilmek istersiniz * * ptr'. –

cevap

10

yapabilirsiniz testi:

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

Ama açma şey bu tür için, muhtemelen bir ziyaretçi desen anlaşılacağı gibi genellikle dinamik sevkini kullanmalıdır. Kodunuzu dynamic_cast ile boşaltmak, korunmasını zorlaştırır. Hemen hemen NEVER kullanıyorum dynamic_cast.

20

, sadece o temel sınıf sanal yöntem yapacak:

Ptr<BaseClass> ptr; 

ptr->Action(); 

ve gerektiğinde her sınıf uygulamak gerekir. Bunun gerçek bir cevap olmadığını anlıyorum, ama genellikle daha iyi olduğu düşünülen hedefinizi gerçekleştirmenin alternatif bir yolu, bu yüzden bahsetmeye değer olduğunu düşünüyorum. BaseClass (sanal fonksiyonları içerir) polimorfik ise

+0

teşekkürler. Bu benim ilk düşüncemdi, ama belli bir sınıfta bir const metoduna sahip olmama problemi vardı ve bir diğerinde non-const vardı, bu yüzden bu davranışı yeni bir metotla eklemek istedim. – lordlabakdas

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

Üçüncü bir seviye varsa, "DerivedClass1_1" ve "DerivedClass1_2" deyin, ilk "if" cümlesi hem bunları bir "DerivedClass1" olarak ele alır - OP'nin istediği şey bu olabilir veya olmayabilir. –

+0

@ Bileşen10 OP'nin sorusunu basitçe yanıtladı. Bu uygulamayı göz ardı etmiyorum ve genellikle bunun sadece _bad tasarım kararları verildiğinde gerekli olduğunu buldum. OP'nin böyle bir şeyi denemeye karar vermesi durumunda, miras durumunu işaret ettiğiniz için teşekkür ederiz. – Aesthete

İlgili konular