检测是否调用了析构函数

Detecting whether a destructor has been called

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

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

然而,我想知道是否可以按照以下方式说些话:

if(king_destructor is called){
     game over;}

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

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

class pieces{}
class king : public pieces{}

其中 pieces 是一个抽象 class 并且每个单独的 piece 都有派生的 classes。在 'king' 片的派生 class 中有它的析构函数。 否则:

class game_board{}

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

终于派生了class :

class game_rules: public game_board{}

正是在这个 class 中,我有一个检测游戏何时结束的功能。

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

有谁知道这是否可能?

您可能有多种方法可以实现类似的功能。从你的描述中让我印象深刻的是从棋盘位置到棋子指针的映射。你没有指定什么样的指针,所以我会即兴发挥。假设地图包含 shared pointers to pieces. Then game_board could maintain weak pointers to the kings. Instead of searching all of your pieces, you could simply see if the weak pointers are expired。这不仅会告诉您游戏是否结束,还会告诉您谁输了。

I experimented with using a static variable that is modified by the 'king' destructor but this is out of the scope of my game_rules class.

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

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

    private:
        static unsigned instance_count;
};

(当然,您的 class 定义的其余部分也将放入其中。)

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

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