我正在开发一款游戏,我有一个树类。该类有一个名为“wood”的整数,它保留树中剩余的木头数量。还有一个功能可以跟踪所有事件。当值达到零时,我想删除这个对象。(顺便说一句,我正在使用 CodeBlocks 和 SDL 库)
handle_events 函数:
void Tree::handle_events(SDL_Event event, int MouseX, int MouseY, int Xoffset, int Yoffset) {
if(event.type == SDL_MOUSEBUTTONDOWN) {
if( event.button.button == SDL_BUTTON_LEFT ) {
if((MouseX >= (xPos - Xoffset)) && (MouseX <= ((xPos + 50) - Xoffset)) && (MouseY >= (yPos - Yoffset)) && (MouseY <= ((yPos + 50) - Yoffset))) {
selected = true;
} else {
selected = false;
}
}
}
if(wood <= 0) {
delete this;
}
当我启动游戏并且“木头”变为零时,树仍然存在并且在工作。 请帮忙
编辑:
while(SDL_PollEvent(&event)) {
MouseX = event.motion.x;
MouseY = event.motion.y;
menu_button.handle_button_events(event, MouseX, MouseY);
exit_button.handle_button_events(event, MouseX, MouseY);
for(int i = 0; i < trees.size(); i++)
{
trees[i].handle_events(event, MouseX, MouseY, Xoffset, Yoffset);
}
for(int i = 0; i < stones.size(); i++)
{
stones[i].handle_events(event, MouseX, MouseY, Xoffset, Yoffset);
}
for(int i = 0; i < bushes.size(); i++)
{
bushes[i].handle_events(event, MouseX, MouseY, Xoffset, Yoffset);
}
if(event.type == SDL_QUIT) {
running = false;
}
if(event.type == SDL_KEYDOWN) {
switch(event.key.keysym.sym) {
case SDLK_ESCAPE:
running = false;
}
}
if(exit_button.clicked) {
running = false;
}
if(menu_button.clicked) {
paused = true;
}
}
Trees 是一个包含 map 上所有树的 vector
最佳答案
什么是 trees
在 trees[i]
?我想是std::vector<Tree*>
或类似的?
当您调用 delete this
时您正在删除 trees[i]
引用的对象,但您没有删除 vector 中的条目。删除后trees[i]
指向一些释放的内存 - 如果没有被其他东西覆盖 - 仍然看起来像一个树对象。
我建议这样做:
for(int i = trees.size()-1; i >= 0; i--) {
trees[i].handle_events(event, MouseX, MouseY, Xoffset, Yoffset);
if (trees[i].isEmpty()) {
delete trees[i];
trees.erase(trees.begin()+i);
}
}
请注意,从末尾开始迭代很重要,因为当元素被移除时,所有后续元素都将移动。
如果 vector 很大并且您要进行大量删除,请考虑使用不提供随机访问的不同结构,因为从 vector 中删除可能很耗时。
更新:
我假设成员函数 Tree::isEmpty()
由您使用指定对象何时为空且不再需要的逻辑来实现,但实际上并没有删除该对象。
因为,正如您所说,trees
是 Tree
的 vector 对象,而不是它们的指针,你应该永远不要自己删除这些对象! vector 是这些对象的所有者,它将删除它们。
因此,您应该直接调用 trees.erase(trees.begin()+i)
它将丢弃该对象。
关于c++ - 删除类内部成员函数中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073900/