纯虚基向量的返回元素 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 的指针)
我有一个虚拟 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 的指针)