c++ - 删除类内部成员函数中的对象

标签 c++ class object this delete-operator

我正在开发一款游戏,我有一个树类。该类有一个名为“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

最佳答案

什么是 treestrees[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()由您使用指定对象何时为空且不再需要的逻辑来实现,但实际上并没有删除该对象。

因为,正如您所说,treesTree 的 vector 对象,而不是它们的指针,你应该永远不要自己删除这些对象! vector 是这些对象的所有者,它将删除它们。

因此,您应该直接调用 trees.erase(trees.begin()+i)它将丢弃该对象。

关于c++ - 删除类内部成员函数中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073900/

相关文章:

java - 可以在一个对象中存储字符串和整数

Python对象交互

c++ - 使用 istream (std cin) : prevent "[input] is not recognized as ..." on Windows

c++ - 为什么 std::atomic<T>::compare_exchange_* 不应遭受 ABA 问题?

c++ - 用于多维数据访问的 overload() 运算符

Java 面向对象的类之间的函数调用

c++ - 嵌套在模板类中的模板类在 MSVC++ 中给出错误

c++在类方法中使用cout

c++ - 类和类成员将使用的公共(public)函数放在哪里?

java - 如何使用 CSV 文件中每一行的数据在 Java 中创建对象