Почему компилятор не может найти метод суперкласса? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь сделать наследование классов в C ++, но, очевидно, он работает совсем не так, как в Python.

Сейчас у меня есть два класса, один из которых называется Player, который является базовым классом, идругой под названием HumanPlayer - это подкласс.

Класс Player - это абстрактный класс, который имеет два способа работы.

Первый - это то, что он действует как синглтон.Он имеет одну статическую функцию с именем make_move, которую люди могут вызывать с int и TicTacToeGame&, и он сделает ход для игрока с этим int в качестве номера игрока в этой игре TicTacToe.

Во-вторых, он работает как класс для создания объектов, у которых в качестве свойства указан номер игрока.Итак, если вы создаете объект с помощью класса, вы должны получить обратно объект со свойством player_number.Затем, если вы вызываете функцию make_move, когда на объекте просто TicTacToeGame&, он автоматически подключит свой номер игрока и использует метод статического класса, чтобы сделать ход в игре.

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

Вот код:

#include <iostream>
#include <string>
using namespace std;

class TicTacToeGame {

};

class Player {
    public:
        static void make_move(int player_number, TicTacToeGame& game);

    protected:
        int player_number;

    public:
        explicit Player(int player_number_param) {
            player_number = player_number_param;
        }

    public:
        void make_move(TicTacToeGame& game) {
            return make_move(player_number, game);
        }
};

class HumanPlayer: public Player {
    public:
        static void make_move(int player_number, TicTacToeGame& game) {}

    public:
        HumanPlayer(int player_number_param): Player(player_number_param) {}
};

int main()
{
    TicTacToeGame game;
    HumanPlayer human_player = HumanPlayer(2);
    human_player.make_move(game);
    return 0;
}

Недавно я узнал, что подклассы не наследуют конструкторы, поэтому оказывается, что я должен написать как новую статическую функцию, так и конструктор, что я и сделал.Однако всякий раз, когда я инициализирую новый объект HumanPlayer, компилятор не может найти совпадение для метода make_move(TicTacToeGame&), и я не уверен, почему.

Конкретное сообщение об ошибке Яполучение

C: \ Users \ London \ Desktop \ Python Programs \ LearningC ++ \ FirstProgram_SO.cpp: в функции 'int main ()': C: \ Users \ London \ Desktop \ Python Programs \LearningC ++ \ FirstProgram_SO.cpp: 41: 29: ошибка: нет соответствующей функции для вызова «HumanPlayer :: make_move (TicTacToeGame &)» human_player.make_move (game);^ C: \ Users \ London \ Desktop \ Python Programs \ LearningC ++ \ FirstProgram_SO.cpp: 29: 15: примечание: кандидат: статический void HumanPlayer :: make_move (int, TicTacToeGame &) статический void make_move (int player_number, TicTacToeGame & game) {}^ ~~~~ C: \ Users \ London \ Desktop \ Python Programs \ LearningC ++ \ FirstProgram_SO.cpp: 29: 15: примечание: кандидат ожидает 2 аргумента, при условии 1

Как я могу получитьHumanPlayer класс для работы так же, как класс Player делает?

1 Ответ

0 голосов
/ 24 мая 2018

Переопределение статической функции с тем же именем скрывает ту, которую вы хотите использовать.

Либо переименуйте ее по-другому, либо добавьте

public:
    using Player::make_move;

Обратите внимание, что в отличие от Java вы неНеобходимо повторять public: перед каждой функцией, такая же видимость применяется до тех пор, пока вы ее не измените.

class YourClass {
public:
    void foo1(); // public
    void bar1(); // also public
protected:
    void foo2(); // protected
    void bar2(); // also protected
};
...