多态性不能正常工作
Polymorphism doesn't work as it should
我花了几个小时来寻找这个错误,现在至少我知道问题出在哪里,但我不知道为什么。
所以我有:
std::vector< std::vector <Organism* > >world;
我有基类Organism
和子类Beetle
和Ant
。
在基类Organism
中,我有虚函数:
private:
bool energy;
public:
Organism():energy(true){}
virtual void removeEnergy(){
energy = false;
}
virtual bool hasEnergy(){
return energy;
}
virtual void resetEnergy(){
energy = true;
}
而且我没有在任何子类中覆盖它们。我在子类中调用了基类构造函数。
当我调用此函数时:
void World::replaceOrganism(int x, int y, int newX, int newY){
world[newX][newY] = world[x][y];
world[x][y] = new Organism;
world[newX][newY]->removeEnergy(); // this line
}
它仅从此类对象中删除能量。这意味着如果在向量world
中有多个甲虫,那么通过以下行:
world[newX][newY]->removeEnergy();
能量从所有这些中移除。
我认为这是与向量有关的东西。有人有什么建议吗?如果您需要更多信息 ->评论我会添加。
如果我删除该行,还有一件事:
world[newX][newY]->removeEnergy();
然后Organism
类对象或其子对象的能量不会改变。
编辑
创建世界矢量:
world.resize(worldSizeX);
for (int x = 0; x < worldSizeX; x++){
world[x] = std::vector< Organism* >(worldSizeY);
// INITATES world ARRAY
for (int y = 0; y < worldSizeY; y++){
world[x][y] = new Organism;
}
// !INITATES world ARRAY
}
编辑
更改 replaceOrganism 函数:
void World::replaceOrganism(int x, int y, int newX, int newY){
delete world[newX][newY];
world[newX][newY] = world[x][y];
delete world[x][y];
world[x][y] = new Organism;
}
删除 word[newX][newY] 指向的所有类对象,但函数只调用一次。
编辑
将类对象替换为其子对象的函数Organism
。
bool World::createOrganism(int x, int y, Organism* organism){
Organism* empty = new Organism;
if (world[x][y]->type() != empty->type()){
delete empty;
return false;
}
else{
delete empty;
world[x][y] = organism;
return true;
}
}
我这样称呼它:
createOrganism(2,3,new Beetle);
编辑
void World::generateOrganisms(Organism* organism, int amount){
while (amount != 0){
int x = rand() % worldSizeX;
int y = rand() % worldSizeY;
if (createOrganism(x, y, organism)){
amount--;
}
}
}
一切都指向同一个对象。
generateOrganisms(Organism* organism, int amount)
你设置的所有几个指针都指向同一个生物体。 所以都是同样的甲壳虫。
您需要预见您的有机体的附加虚拟功能:
Organism *clone() {
// create a new organism of the same type
}
应该为每个子函数覆盖这个虚函数,以使用正确的构造函数创建一个新的有机体。
然后,您可以更新创建函数:
bool World::createOrganism(int x, int y, Organism* organism){
Organism* empty = new Organism;
if (world[x][y]->type() != empty->type()){
delete empty;
return false;
}
else{
delete empty;
world[x][y] = organism->clone(); // use a clone, not the original
return true;
}
}
此外,我不确定是否根据需要删除所有未使用的对象(至少,仅使用您提供的狙击手很难说(。 可能值得调查shared_ptr的潜在用途,以避免泄漏内存。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程