【问题标题】:Any way I can call destructor function do destroy an object? c++/smfl有什么方法可以调用析构函数来销毁对象? c++/sfml
【发布时间】:2021-07-04 17:31:21
【问题描述】:

在 SFML 中,我试图创建一个游戏,并创建了一个 Bullet 类,我在其中放置了一个析构函数。我想在按下按钮时摧毁子弹,但是当我按下它时,我的窗口冻结了,pc kina 崩溃了。有什么方法可以破坏对象吗?我已经试着不画了,但它还在那里,只是看不见。

if (sf::Keyboard::isKeyPressed(sf::Keyboard::E)) bullet1.~Bullets(); the error after the program crashes

【问题讨论】:

  • 几乎没有充分的理由手动调用析构函数。最好的方法是将bullet1 放入可以从中删除的某种容器中,例如std::vectorstd::optionalBullet被销毁后做了什么工作?
  • 在您的问题中提供一些minimal reproducible example,并花更多时间阅读有关 C++ 和 SFML 的信息
  • 请注意,如果您刚刚开始学习 C++,SFML 显然不是一个很好的库。它假定您熟悉许多高级和细微的 C++ 功能,如果您搞砸了,它不会帮助您。来自SFML FAQ"don't start with SFML if you are trying to grasp the basic language features of C++"
  • bullet1.~Bullets(); 这会使对象未初始化,任何使用它的尝试都会导致未定义的行为。显式的析构函数调用很少是个好主意,但如果你必须这样做,那么至少要让对象保持一致的状态,例如在析构函数以重新初始化对象。

标签: c++ class sfml destructor


【解决方案1】:

您不能显式调用析构函数,但您可以获得相同的行为,将项目符号放在指针中并在其上调用 delete。请务必在任何 delete 之前始终使用 new,在每个 new 之前使用 delete

// When declaring your variables
Bullets* bullet1 = nullptr; // don't call delete in this state
...

// In your bullet creation code
bullet1 = new Bullets();
...

// Delete the object and put pointer to null
delete bullet1; // Destructor will be called here
bullet1 = nullptr;

// When drawing it you must check if the object exists
if(bullet1 != nullptr){
  window.draw(bullet1);
}

无论如何,正如 cmets 中所说,在您充分了解 C++ 基础和 OOP 之前,您不应该从 SFML 开始

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 2014-05-12
    • 2018-02-07
    • 2018-11-24
    • 2016-11-10
    • 2016-09-19
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多