纯虚基向量的返回元素 class

Returning element of a vector of a pure virtual base class

我有一个虚拟 class 动物,我想将 Animal 对象存储在一个向量中,并能够通过索引访问该向量中的任何 Animal 对象。

我声明了我的向量:std::vector <Animal*> anim;

我可以使用以下方法添加到我的向量中:

void Shelter::add_animal(Animal& animal){
    anim.push_back(&animal);
}

但是当我尝试访问我的动物时:

Animal& Shelter::animal(int index){
    return anim[index];
}

我运行出错了

shelter.cpp:18:28: error: invalid initialization of reference of type ‘Animal&’ from expression of type ‘__gnu_cxx::__alloc_traits<std::allocator<Animal*> >::value_type {aka Animal*}’
     return _anim[index];

我想了解为什么我无法像过去访问矢量那样访问此矢量。谢谢!

您正在存储指向 Animals 而非 Animals 的指针。取消引用指针。

Animal& Shelter::animal(int index){
    return *anim[index];
}

/编辑

我原来的建议是不正确的,但这就是我提出那个建议的原因....

您可能需要考虑更改界面:

void Shelter::add_animal(Animal& animal);

这几乎可以保证维护的噩梦。这意味着我可以做到:

void makePig(Shelter& s)
{
  Pig littlePiggy;
  s.add_animal(littlePiggy);
}

这就是我最初认为代码的使用方式(因此在回答问题时出现解析错误)。就个人而言,我认为这样会更好:

void Shelter::add_animal(Animal* animal);

原因很简单,使用此接口,如果您这样做,所有编译器都会发出警告:

  Pig littlePiggy;
  s.add_animal(&littlePiggy); //< Warning! taking address of temp var. 

使用原始界面,永远不会生成此类警告,并且该界面暗示您将向其中复制数据(而不是存储指向某个 var 的指针)