当我检查向量的元素时,我遇到了一个奇怪的问题,该向量应该通过基类指针多态指向派生对象。
这是我的载体:
std::vector<Gun*> weapons;
这是实例化:
weapons.reserve(3);
weapons.push_back(new Pistol());
weapons.push_back(new Rifle());
weapons.push_back(new Shotgun());
这很好用,但是一旦构造函数退出,对象现在是基类类型,而不是派生类型。为什么会这样?
答案 0 :(得分:1)
你有一些错误:
std::vector<Bullet> Bullets();
返回项目符号的副本,而不是基础对象。所以当你这样做时:
Bullets().push_back(Bullet(Position(), Rotation(), velocity, Colour()));
它没有按照你的预期去做。
你最有可能想要两者:
const std::vector<Bullet>& Bullets() const;
std::vector<Bullet>& Bullets();
话虽如此,就像@John所说,Access违规很可能是武器阵列不够大的问题(也许是因为上面的错误)。错误将出现在填充武器的代码中。你说RIFLE是2,但是你发布的代码实际上是索引1,而不是2,所以我猜你有SHOTGUN设置为3,它应该是2,这超出了数组的范围,因此访问保护错误。经典的一个一个。
答案 1 :(得分:0)
您似乎没有以任何方式切割对象 - 这可能不是问题。
最可能的嫌疑是您访问vector
的方式以及vector
中的项目数量与您认为应该存在的数量相同的概率:
weapons[RIFLE]
你怎么知道这里有一个有效的对象?鉴于您正在获得访问冲突,似乎该索引上没有有效的对象。
你应该做更多的事情:
if( weapons.size() >= RIFLE )
{
Gun* gun = weapons.at(RIFLE);
gun->Ammo();
}
else
{
cerr << "WHOA! Something blowed up...";
}