私は最良の方法で処理する方法がわからないという設計上の問題があります。私は自分のコードを将来的に証明し、まだまだ複雑で複雑ではない(オタクの苦境)ようにしたい。dynamic_castとポリモーフィズムのベストプラクティス
現在、私のデザインは次のセットアップ
derived class D derived class E
^ ^
| |
derived abstract class B -> derived class C
^ ^
| |
Abstract Base class A
クラスB
は、クラスB
とC
からクラスD
とクラスE
異なり、クラスA
異なり、クラスA
異なっています。
これらのクラスが異なるため、dynamic_cast
演算子を使用する必要があります。
A* a1 = new class C;
C* c1 = dynamics_cast<C*>(a1);
if(c1){ //Success!!!}
...
あなたは、私は多くのことをdynamic_cast
使用したいことでしょう見ることができるように!私はこれを行う良い方法を見つけようとする必要があります。それはif()
ステートメントがいっぱいではありません。
これを行うためのすてきな方法はありますか?私はScott Meyersの本で何かを見ているのを覚えているようですが、私は家から離れており、1〜2週間はアクセスできません。
いずれの参考文献も参考にしてください。必要であれば
また、私は解決策
B* d1 = new D;
B* e1 = new E;
ではなく、理想的なの一種だろうインターフェイスにクラスB
を作ることができます。
注:私は私の現在の設計の失敗
class A {...};
class B: public A {
public:
virtual std::vector<objectType1*>& getObjectType1();
};
class C: public B {
private:
void newFunction();
};
A* c1 = new C();
std::vector<objectType1*> example = c1->getObjectType1(); // Wrong; need dyanmic_cast :-(
は、Aはこの機能について知らない静的な型としてdynamic_cast
なしgetObjectType1()
にアクセスすることはできません表示するには、この例を追加しました。私は私のデザインを再考する必要があります。何か案は?
あなたは継承を意味するためにdifferentを使用しているように見えます。なぜあなたがダウンキャストする必要があるのかについての詳細は教えてくれませんでした。どうして? –
仮想関数を使用します。 –
何らかの形で「違い」しなかった場合は、クラスを持つポイントはありませんが、どのような意味がありますか?無関係の追加機能を提供する際に彼らが違っていて、あなたが太ったインターフェースを必要としないということを意味するなら、それは普通ではないが醜いですが、 'dynamic_cast <>'は妥当かもしれません。より簡潔でより良いスコープ付き表記は 'if(C * p = dynamic_cast(a1))...'です。それでも、「クラスBはインターフェイスであることは解決策の一種になります」と私には分かりません。おそらく間違っているように、各クラスにどのような機能を組み込んでいるのか説明する必要があります。 –