考虑以下示例代码:
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
in d_foos
其声明于FooCollection
。我现在想向客户端代码公开指向 Bars 的指针集合。我可以让客户端代码访问指向的指针向量Foo
s 并将它们转换为指向的指针Bar
s 在客户端代码中,但这感觉不对,因为客户端不必知道Foo
的存在。
我还可以定义一个get()
从中检索对象的成员d_foos
并投射它们,但这感觉很笨拙。最好,我只想返回 d_foos 作为vector<shared_ptr<Bar> > &
,但我似乎无法做到这一点。
也可能是我的设计完全错误。但这似乎是最自然的解决方案,因为Bar
是一个专业化Foo
and BarCollection
是一个专业化FooCollection
并且它们共享功能。
您能否提出一些好的实施方案getBars
in BarCollection
或者更好的设计替代方案?
Edit:
事实证明我的设计确实很糟糕。尽管 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.
};
感谢所有出色的建议和示例!
我建议从容器类而不是成员容器中公开迭代器。这样,容器类型是什么就无关紧要了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)