C++ 纯虚基类向量的返回元素
我有一个虚拟类Animal,我想将动物对象存储在一个向量中,并且能够通过索引访问这个向量中的任何动物对象 我声明了我的向量:C++ 纯虚基类向量的返回元素,c++,oop,vector,pure-virtual,C++,Oop,Vector,Pure Virtual,我有一个虚拟类Animal,我想将动物对象存储在一个向量中,并且能够通过索引访问这个向量中的任何动物对象 我声明了我的向量:std::vector anim 我可以使用以下方法添加到我的向量: void Shelter::add_animal(Animal& animal){ anim.push_back(&animal); } 但当我尝试使用以下工具访问我的动物时: Animal& Shelter::animal(int index){ return
std::vector 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];
horder.cpp:18:28:错误:从类型为“\uu gnu\u cxx::\uu alloc\u traits::value\u type{aka Animal*}”的表达式初始化类型为“Animal&”的引用无效
返回动画[索引];
我想理解为什么我不能像过去那样访问向量。谢谢 您正在存储指向动物而不是动物的指针。取消对指针的引用
动物和收容所::动物(int索引){
返回*动画[索引];
}
/编辑
我最初的建议是不正确的,但这就是我提出这个建议的原因
您可能需要考虑更改接口:
void庇护所::添加动物(动物和动物);
这几乎保证了维护的噩梦。这意味着我可以做到:
void makePig(避难所和s)
{
小猪;
s、 添加_动物(小动物);
}
这就是我最初认为代码会被使用的方式(因此我在回答问题时出现了解析错误)。就个人而言,我认为这会更好:
void庇护所::添加_动物(动物*动物);
原因很简单,使用此接口,如果执行此操作,所有编译器都会发出警告:
Pig littlePiggy;
s、 添加动物(&littlePiggy);/<警告获取临时变量的地址。
对于原始接口,将不会生成此类警告,并且该接口意味着您将向其中复制数据(而不是存储指向某个变量的指针)std::vector
将不起作用,原因非常明显。我同意std::vector
不起作用,但我非常感谢robthebloke指出我必须取消引用。更新了我的答案,解释了我为什么提出那个建议。对于庇护所对象的实际操作,它不是一个很好的界面。这里的关键问题是确定庇护所是否包含并管理一组动物(例如,当庇护所不存在时,所有动物也会这样做),或者庇护所是否仅与一组动物关联(例如,如果庇护所
被拆除,动物是否继续存在)。就我个人而言,我根本不会有庇护所::添加_animal()
功能。相反,我会给动物
一个使用(庇护所&)
功能,允许动物与庇护所联系并使用庇护所,但实际上不是庇护所的一部分。