【问题标题】:Detecting whether a destructor has been called检测是否调用了析构函数
【发布时间】:2020-05-09 05:16:46
【问题描述】:

我正在制作一款棋盘游戏,当一个棋子被摧毁时游戏结束,例如一位国王死于国际象棋。

现在我可以搜索我所有的对象并看到,例如,有两个指向国王对象的指针,现在只有一个,因此游戏结束,剩下国王的球队获胜。

然而,我想知道是否可以这样说:

if(king_destructor is called){
     game over;}

但经过一番搜索后,我还没有找到一种方法来做到这一点。

更具体地说,我的班级结构是:

class pieces{}
class king : public pieces{}

其中pieces 是一个抽象类,每个单独的pieces 都有派生类。在“国王”部分的派生类中有它的析构函数。 否则:

class game_board{}

这是另一个抽象类,它具有指向片段对象的数据成员。确切地说,我有一个 map 变量,它以棋子在棋盘上的位置为键,以指向棋子对象的指针为值。

我终于有了一个派生类:

class game_rules: public game_board{}

在这个类中,我有一个函数可以检测游戏何时结束。

我尝试使用由“king”析构函数修改的静态变量,但这超出了我的 game_rules 类的范围。

有人知道这是否可能吗?

【问题讨论】:

  • 为什么不确保static 变量在正确的范围内?这种方法应该可以正常工作。
  • 检查地图是否包含国王?检查国王是否是nullptrking 在调用其析构函数时是否调用了回调函数?除此之外,您无法在调用析构函数后访问king 变量,而且我认为除了跟踪状态或检查其指针是否为空之外,没有其他方法可以检查是否已释放某些内容。
  • 检查地图是否包含我可以做的国王,但我想知道是否有比循环遍历整个地图更优雅的方法。据我所知,如果不遍历每个键,我无法在地图中找到某种类型的所有对象,但如果可能的话,那将非常有趣!
  • 我会尝试更多地使用静态变量。感谢您的建议

标签: c++ visual-c++ destructor


【解决方案1】:

我尝试使用由“国王”析构函数修改的静态变量,但这超出了我的 game_rules 类的范围。

这似乎是合理的。我不明白为什么范围是一个问题。该变量将是 king 类的私有变量,但具有公共只读访问权限。

class king : public piece {
    public:
        static unsigned count() { return instance_count; }

    private:
        static unsigned instance_count;
};

(当然,你的类定义的其余部分也会放在那里。)

game_rules 的源文件中,您将使用#include "king.hpp"(或您命名该头文件的任何名称)并使用表达式king::count() 获取国王数的值。 (可以在没有该类型对象的情况下调用静态成员函数。)例如,您可以编写如下内容。

if ( king::count() <= 1 ) {
    // Game over
}

【讨论】:

  • 但是我怎么能在游戏规则类的函数中看到静态变量的值呢?因为它不是从片段派生的,所以它只是从包含片段数据成员(指向这些对象的指针)的类派生而来。
  • 通过调用静态函数可以看到静态变量的值。看到静态函数(像往常一样)只是#includeing 适当的标题。如果你不熟悉静态成员函数,那么你应该要求澄清如何调用king::count()
【解决方案2】:

可能有几种方法可以实现这样的功能。你的描述让我印象深刻的是从棋盘位置到棋子指针的地图。你没有指定什么样的指针,所以我会即兴发挥。假设地图将shared pointers 分割成碎片。然后game_board 可以维持weak pointerskings。您可以简单地查看弱指针是否为expired,而不是搜索您的所有部分。这不仅可以告诉您游戏是否结束,还可以告诉您谁输了。

【讨论】:

  • 我应该说我只是使用原始指针。我才刚刚开始学习智能指针,所以我会尝试一下,看看我是否可以让它工作。
  • 我一直在阅读有关智能指针的更多信息,我试图完全理解您的评论。我真正不明白的是,当我使用“过期”时,我将如何引用弱指针,因为尽管它们具有唯一的 ID 数据成员,但我没有命名指针。同样,在什么意义上,过期的弱指针也会告诉你谁赢了?谢谢
  • @user3626437 好吧,第一步是命名指针。回到"game_board可以维护指向kings"的弱指针,在这个上下文中,"maintain"的意思是"给类添加成员",这意味着给这些成员某种名称。如果你的类看起来像class game_board { std::map&lt;position, std::shared_ptr&lt;piece&gt;&gt; board; },那么在添加弱指针之后,它可能看起来像class game_board { std::weak_ptr&lt;piece&gt; king1, king2; std::map&lt;position, std::shared_ptr&lt;piece&gt;&gt; board; }
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 2013-06-25
  • 2022-01-12
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
相关资源
最近更新 更多