多态性和指针 vector 的c++问题

标签 c++ vector polymorphism shared-ptr

考虑以下示例代码:

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_foosFooCollection 中声明.我现在想将指向 Bars 的指针集合公开给客户端代码。我可以让客户端代码访问指向 Foo 的指针 vector s 并将它们转换为指向 Bar 的指针s 在客户端代码中,但这感觉不对,因为客户端不必知道 Foo的存在。

我还可以定义一个 get()d_foos 检索对象的成员并转换它们,但这感觉很笨拙。最好,我只想将 d_foos 作为 vector<shared_ptr<Bar> > & 返回,但我似乎无法做到这一点。

也可能是我的设计完全错误。这似乎是最自然的解决方案,因为 BarFoo 的特化和 BarCollectionFooCollection 的特化他们共享功能。

您能否提出很好的解决方案来实现 getBarsBarCollection还是更好的设计方案?

编辑:

事实证明我的设计确实很糟糕。 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/

相关文章:

c++ - 指针 vector 中的内存泄漏

Python:余弦相似度 m * n 矩阵

c++ - 我收到此错误 : "glibc detected"

scala - 尝试将 F 有界多态性建模为 Scala 中的类型成员

c++ - std::for_each 中的多态仿函数

c++ - 消除类模板中基类名称的歧义

c++ - 如何添加和读取两种类型变量的 vector 元素

ruby-on-rails - 在 Rails 中创建为多态类型

c++ - curl 停止在 Linux 上使用多个连接进行下载

c++ - 在 std::map 中插入 typedef 时出现问题