Я потратил несколько часов на то, чтобы найти эту ошибку, теперь, по крайней мере, я знаю, где проблема, но я понятия не имею, почему.Полиморфизм не работает так, как должно было
Так у меня есть:
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
объектов класса или его детей не меняется.
EDITED
Создание мирового вектора:
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
}
EDITED
Изменение функции 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;
}
удаляет все объекты класса, которое указывает слово [newX] [newY], но функция вызывается только один раз.
EDITED
функция, которая заменяет 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);
EDITED
void World::generateOrganisms(Organism* organism, int amount){
while (amount != 0){
int x = rand() % worldSizeX;
int y = rand() % worldSizeY;
if (createOrganism(x, y, organism)){
amount--;
}
}
}
Все указывает на тот же объект.
Проблемы с разделением? –
Это непонятно. Что вы подразумеваете под «удаляется из всех». Пожалуйста, создайте тестовый пример, демонстрирующий это. –
Вы уверены, что вы правильно инициализируете мир? Как я могу догадаться, это означает, что каждый указатель Beetle в вашем мире указывает на того же Beetle. – Alexandru