【问题标题】:Passing a list of derived classes to a function expecting a list of base classes in C++将派生类列表传递给需要 C++ 中基类列表的函数
【发布时间】:2011-02-28 05:44:42
【问题描述】:

我有以下课程

class Parent {
  virtual void doStuff() = 0;
};

class Child : public Parent {
  void doStuff() {
    // Some computation here
  }
};

我有一个带有以下签名的函数。

void computeStuff(std::vector<boost::shared_ptr<Parent> >);

如果我可以重构我的代码(包括函数签名),向函数computeStuff 传递指向Child 对象的指针列表的最佳方式是什么?

本质上,我想编译和运行下面的 sn-p 代码

std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
computeStuff(listOfChilds);

【问题讨论】:

    标签: c++ list inheritance vector shared-ptr


    【解决方案1】:

    “最好”的方法是让函数采用一对迭代器:

    template <typename ForwardIterator>
    void computeStuff(ForwardIterator first, ForwardIterator last) {
        /* ... */
    }
    

    您可以将此函数称为:

    std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
    computeStuff(listOfChilds.begin(), listOfChilds.end());
    

    使用一对迭代器而不是容器有很多优点,但这里的两个最大的优点是

    • computeStuff 函数可以从任何类型的容器中获取范围,而不仅仅是 std::vector,并且

    • 范围只需要包含可转换为您要使用的类型的对象(例如boost::shared_ptr&lt;Parent&gt;),实际上不必包含该特定类型的对象。

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 2015-08-20
      • 2013-08-02
      • 2012-03-14
      • 2020-01-09
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多