2017-06-15 9 views
-2

を行った後、私はこのような構造を持っているクラスの種類を知っている:いけない、私は<のdynamic_cast>

class IIterator : public ICollectible{}; 
class A: public ICollectible{}; 
class b: public A{}; 
class c: public A{}; 
class d: public A{}; 

私は

IIterator* it = colection->getIterator(); 
whatType* db = dynamic_cast<whatType*>(it->hasCurrent()); 

このようなコスプレイ@ダイナミックセーラータイプの要素を持つリストである何かをするとき A (タイプ bcまたは dのオブジェクトを持つことができます) hasCurrent()は私に何かタイプのICollectibleを与えますので、実行する必要があります

ダイナミックキャストですので、 とbcまたはdと入力できますが、どのようになっているのですか?

+3

本当のタイプが何であるかを知る必要がある場合は、タイプを混在させるポイントは何ですか? – Stargateur

+1

ようこそスタックオーバーフローへ。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+0

そして私はクラスAの何かの3つの異なるリストを保持しますか? –

答えて

2

dynamic_castのポイントは、正しいタイプのものか、nullptrを返すかどうかを知らせることです。だから、あなたが行うことができます。もちろん

if (b *p = dynamic_cast<b *>(it->hasCurrent())) { 
    // its b 
} else if (c *p = dynamic_cast<c *>(it->hasCurrent())) { 
    // its c 
} else if (d *p = dynamic_cast<d *>(it->hasCurrent())) { 
    // its d 
} else { 
    // none of the above 

を、多くのOOの純粋主義者は、この「悪いコードのにおい」を検討する - あなたはあなたのインターフェイスクラスの仮想関数を定義して、それを呼び出すのではなく、さまざまな派生型をテストする必要があります。

+0

私はそれをやっていましたが、もう一つの方法が多形性を使用することです別の方法があると思ったので、ひどいと思われました –

+0

@MarcosAyala。 'std :: function'、仮想ディスパッチ、あるいは関数ポインタを介して。 –

関連する問題

 関連する問題