在C ++中使用带有STL容器的接口

时间:2016-09-02 13:36:25

标签: c++ c++11 vector stl

我有两个具有共同方法的结构,它们在接口中定义(我无法更改这些):

struct Interface {
   virtual int Foo() = 0;
};
struct A : Interface {
  virtual int Foo() override;
  //A specific methods etc  
};
struct B : Interface {
  virtual int Foo() override;
  //B specific methods etc
};

如果有一个需要接受接口的功能,那么它非常简单:     //成员变量     std :: vector m_as;

int DoubleFoo( Interface& obj ) {
  return obj.Foo() * 2;
}

DoubleFoo(m_as[0]);

但是如果有一个需要多个接口的功能那么它就不那么简单了:

int SumFoo( std::vector<Interface>& objs ) {
  int sum = 0;
  for (auto&& obj : objs ) {
    sum += obj.Foo();
  }
  return sum;
}

因为如果我有std::vector<A>的现有(例如成员)变量,我不能简单地做:

SumFoo(m_as);

相反,我必须将SumFoo更改为std::vector<Interface*>,并且必须创建指向原始数组中元素的新指针向量。

或者只是在函数调用中强制转换它,这非常难看:

SumFoo((std::vector<Interface>&)m_as);

当涉及到需要它们的向量这样简单的东西时,如何才能轻松/巧妙地使用C ++中的接口?

我明白为什么我不能将一个子类传递给一个函数,因为对象切片等因为它是基类的值。但是为什么不是std::vector<Derived>*std::vector<Base>*的强制转换。 Derived*Base*是?

我想问题是你可以在向量中添加一个Base(),这会导致调用代码出现问题,因为它认为它是Derived的向量,但是你可以将参数设为const,而Base是抽象的反正。

0 个答案:

没有答案