检测是否已调用析构函数

问题描述 投票:0回答:2

我正在制作一个棋盘游戏,棋盘游戏在其中一个棋子被击毁(例如,一位死于国际象棋的国王)时结束。

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

但是我想知道是否有可能像这样说些话:

if(king_destructor is called){
     game over;}

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

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

class pieces{}
class king : public pieces{}

其中段是抽象类,每个段都有派生类。在“国王”作品的派生类中,有它的析构函数。否则:

class game_board{}

这是另一个抽象类,它具有数据成员,这些数据成员是指向件对象的指针。确切地说,我有一个map变量,该变量将棋子在板上的位置作为键,并将指向棋子对象的指针作为值。

最后我有一个派生类:

class game_rules: public game_board{}

在这个类中,我有一个检测游戏结束时间的函数。

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

有人知道这是否可能吗?

c++ visual-c++ destructor
2个回答
0
投票

我尝试使用由'king'析构函数修改的静态变量,但这超出了我的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
}

0
投票

可能有几种方法可以实现这样的事情。您的描述让我印象深刻的是从棋盘位置到棋子指针的映射。您没有指定哪种指针,所以我会即兴发挥。假设地图将shared pointers保留为碎片。然后,game_board可以保持weak pointersking s。无需搜索所有片段,您只需查看弱指针是否为expired。这不仅告诉您游戏是否结束,而且还告诉您谁输了。

© www.soinside.com 2019 - 2024. All rights reserved.