次のコード例を検討してください。
class Foo
{
};
class Bar : public Foo
{
};
class FooCollection
{
protected:
vector<shared_ptr<Foo> > d_foos;
};
class BarCollection : public FooCollection
{
public:
vector<shared_ptr<Bar> > &getBars()
{
// return d_foos won't do here...
}
};
私は現在のプロジェクトでこのような問題を抱えています。クライアント コードは、 inで宣言されているin へのBarCollection
ポインタを格納する を使用します。ここで、バーへのポインターのコレクションをクライアント コードに公開したいと思います。クライアント コードに s へのポインタのベクトルへのアクセスを許可し、これらをクライアント コード内の s へのポインタにキャストすることもできますが、クライアントは の存在を知る必要がないため、これは間違っていると感じます。Bars
d_foos
FooCollection
Foo
Bar
Foo
get()
オブジェクトを取得してキャストするメンバーを定義することもできますd_foos
が、これはかなりぎこちなく感じます。できれば、 d_foos を として返したいのvector<shared_ptr<Bar> > &
ですが、これができないようです。
また、私の設計が単に間違っている可能性もあります。Bar
ただし、の専門化でFoo
ありBarCollection
、の専門化でFooCollection
あり、機能を共有しているため、最も自然な解決策のように見えました。
実装するための優れたソリューション、またはより優れた設計の代替案を提案できますgetBars
かBarCollection
?
編集:
私のデザインは確かに悪かったことがわかりました。FooCollection のすべての機能を必要とするにもかかわらず、BarCollection は FooCollection ではありません。以下の回答に基づく私の現在の解決策 - これは非常にクリーンです - は次のとおりです。
class Foo
{
};
class Bar : public Foo
{
};
template<class T>
class Collection
{
vector<shared_ptr<T> > d_items;
};
typedef Collection<Foo> FooCollection;
class BarCollection : public Collection<Bar>
{
// Additional stuff here.
};
すべての優れた提案と例をありがとう!