gpt4 book ai didi

c++ - 为什么编译器找不到父类(super class)的方法?

转载 作者:行者123 更新时间:2023-11-30 03:23:15 24 4
gpt4 key购买 nike

我正在尝试在 C++ 中进行类继承,但它的工作方式显然与在 Python 中大不相同。

现在,我有两个类,一个名为 Player 的基类,另一个名为 HumanPlayer 的子类。

Player 类是一个抽象类,有两种工作方式。

首先是它的行为像一个单例。它有一个名为 make_move 的静态函数,人们可以用 intTicTacToeGame& 调用它,它会为玩家移动int 作为玩家在 TicTacToe 游戏中的编号。

第二个是它作为一个类来创建以玩家编号作为属性的对象。因此,如果您使用该类构造一个对象,您应该取回一个具有 player_number 属性的对象。然后,如果您只用对象上的 TicTacToeGame& 调用 make_move 函数,它会自动插入玩家编号并使用静态类方法在游戏。

我想为 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: In function 'int main()': C:\Users\London\Desktop\Python Programs\LearningC++\FirstProgram_SO.cpp:41:29: error: no matching function for call to 'HumanPlayer::make_move(TicTacToeGame&)' human_player.make_move(game); ^ C:\Users\London\Desktop\Python Programs\LearningC++\FirstProgram_SO.cpp:29:15: note: candidate: static void HumanPlayer::make_move(int, TicTacToeGame&) static void make_move(int player_number, TicTacToeGame& game) {} ^~~~~ C:\Users\London\Desktop\Python Programs\LearningC++\FirstProgram_SO.cpp:29:15: note: candidate expects 2 arguments, 1 provided

如何让 HumanPlayer 类以与 Player 类相同的方式工作?

最佳答案

同名静态函数的重定义隐藏了你要用的那个。

要么重命名,要么添加

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
};

关于c++ - 为什么编译器找不到父类(super class)的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50498938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com