Consider the following example code:
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...
}
};
I have a problem like this in my current project. The client code uses BarCollection
, which stores pointers to Bars
in d_foos
which is declared in FooCollection
. I'd now like to expose the collection of pointers to Bars to the client code. I could just give the client code access to the vector of pointers to Foo
s and cast these to pointers to Bar
s in the client code, but this feels wrong since the client doesn't have to know about Foo
's existence.
I could also define a get()
member that retrieves objects from d_foos
and casts them, but this feels quite clumsy. Preferably, I'd like to just return d_foos as a vector<shared_ptr<Bar> > &
, but I cannot seem to do this.
It could also be that my design is just plain wrong. It seemed to most natural solution though, as Bar
is a specialization of Foo
and BarCollection
is a specialization of FooCollection
and they share functionality.
Could you suggest nice solutions to implement getBars
in BarCollection
or better design alternatives?
Edit:
Turns out my design was bad indeed. BarCollection is not a FooCollection, despite of requiring all of FooCollection's functionality. My current solution based on the answers below -- which is a lot cleaner -- is now:
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.
};
Thanks for all the excellent suggestions and examples!