Определение того, был ли вызван деструктор - PullRequest
0 голосов
/ 08 мая 2020

Я делаю настольную игру, в которой игра заканчивается, когда одна фигура разрушается, например, король умирает в шахматах.

Теперь у меня есть возможность просмотреть все мои объекты и увидеть, что, например, БЫЛО два указателя на объекты короля, а теперь есть только один, поэтому игра окончена и команда с оставшимся королем выиграла.

Однако мне было интересно, можно ли вместо этого сказать что-то вроде:

if(king_destructor is called){
     game over;}

Но после небольшого поиска я не нашел способа сделать это.

В частности, моя структура класса:

class pieces{}
class king : public pieces{}

, где элементы - это абстрактный класс, а для каждой отдельной части есть производные классы. В производном классе для «королевской» фигуры есть ее деструктор. В противном случае:

class game_board{}

, который является другим абстрактным классом, который имеет элементы данных, которые являются указателями на объекты частей. Если быть точным, у меня есть переменная карты, которая принимает положение фигуры на доске в качестве ключа и указатель на объект фигуры в качестве значения.

Наконец, у меня есть производный класс:

class game_rules: public game_board{}

именно в этом классе у меня есть функция, которая определяет, когда игра окончена.

Я экспериментировал с использованием переменной stati c, которая модифицируется деструктором 'king', но это выходит за рамки моего класса game_rules.

Кто-нибудь знает, возможно ли такое?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Я экспериментировал с использованием переменной stati c, которая изменяется деструктором 'king', но это выходит за рамки моего класса game_rules.

Это кажется разумным. Я не понимаю, почему проблема с размахом. Переменная будет частной для класса king, но с доступом только для чтения publi c.

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

    private:
        static unsigned instance_count;
};

(Конечно, остальная часть определения вашего класса также будет go. )

В исходном файле для game_rules вы должны #include "king.hpp" (или как вы назвали этот заголовочный файл) и получить значение количества королей с выражением king::count(). (Функция-член stati c может быть вызвана без объекта этого типа.) Например, вы можете написать что-то вроде следующего.

if ( king::count() <= 1 ) {
    // Game over
}
0 голосов
/ 08 мая 2020

Вероятно, есть несколько способов реализовать что-то подобное. Что меня поразило из вашего описания, так это карта от позиций на доске до указателей и кусков. Вы не указали, что это за указатель, поэтому я импровизирую. Предположим, карта содержит общих указателей частей. Тогда game_board может поддерживать слабые указатели на king s. Вместо того, чтобы искать по всем вашим частям, вы можете просто посмотреть, не истек ли срок действия слабых указателей . Это не только говорит вам, окончена ли игра, но также говорит, кто проиграл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...