Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 纯虚基类向量的返回元素_C++_Oop_Vector_Pure Virtual - Fatal编程技术网

C++ 纯虚基类向量的返回元素

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

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

我声明了我的向量:
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()
功能。相反,我会给
动物
一个
使用(庇护所&)
功能,允许动物与庇护所联系并使用庇护所,但实际上不是庇护所的一部分。