纯虚拟基类的向量的返回元素

我有一个虚拟类Animal,我想将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];

我想了解为什么我不能像过去访问矢量一样访问此矢量。谢谢!

wushi888 回答:纯虚拟基类的向量的返回元素

您存储的是动物而不是动物的指针。解引用指针。

select t1.* from products t1
inner join
(select max(version) as versionId,productID 
from products
group by productID) t2 on t2.productID = t1.productID and t2.versionId = t1.version
where coalesce(done,'') = ''

/编辑

我最初的建议不正确,但这就是为什么我提出了这个建议。...

您可能要考虑更改以下接口:

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);

使用原始接口时,不会生成任何此类警告,并且该接口表示您将向其中复制数据(而不是存储指向某些var的指针)

本文链接:https://www.f2er.com/3162528.html

大家都在问