考虑以下示例代码:
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...
}
};
我在当前的项目中遇到了这样的问题。客户端代码使用 BarCollection
, 它存储指向 Bars
的指针在 d_foos
在 FooCollection
中声明.我现在想将指向 Bars 的指针集合公开给客户端代码。我可以让客户端代码访问指向 Foo
的指针 vector s 并将它们转换为指向 Bar
的指针s 在客户端代码中,但这感觉不对,因为客户端不必知道 Foo
的存在。
我还可以定义一个 get()
从 d_foos
检索对象的成员并转换它们,但这感觉很笨拙。最好,我只想将 d_foos 作为 vector<shared_ptr<Bar> > &
返回,但我似乎无法做到这一点。
也可能是我的设计完全错误。这似乎是最自然的解决方案,因为 Bar
是 Foo
的特化和 BarCollection
是 FooCollection
的特化他们共享功能。
您能否提出很好的解决方案来实现 getBars
在 BarCollection
还是更好的设计方案?
编辑:
事实证明我的设计确实很糟糕。 BarCollection 不是 FooCollection,尽管需要 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.
};
感谢所有出色的建议和示例!
最佳答案
我建议从您的容器类而不是成员容器中公开迭代器。这样容器类型就无关紧要了。
关于多态性和指针 vector 的c++问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1741720/