为什么编译器找不到超类的方法?
Why can't the compiler find the superclass's method?
我正在尝试在 C++ 中实现 class 继承,但它的工作方式显然与 Python 中的非常不同。
现在,我有两个 classes,一个叫做 Player
,它是基础 class,另一个叫做 HumanPlayer
,它是子[=50] =].
Player
class 是一个抽象 class 有两种工作方式。
首先是它的行为像一个单例。它有一个名为 make_move
的静态函数,人们可以用 int
和 TicTacToeGame&
来调用它,它会为以 int
作为玩家编号的玩家走一步在 TicTacToe
.
的那场比赛中
第二个是它作为 class 来创建玩家编号为 属性 的对象。所以,如果你用 class 构造一个对象,你应该得到一个 player_number
属性 的对象。然后,如果您在对象上仅使用 TicTacToeGame&
调用 make_move
函数,它将自动插入其玩家编号并使用静态 class 方法在游戏中进行移动。
我想要 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;
}
我最近了解到 subclasses 不继承构造函数,所以事实证明我必须同时编写一个新的静态函数和一个构造函数,我已经完成了。
但是,每当我初始化一个新的 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
class 以与 Player
class 相同的方式工作?
同名静态函数的重定义隐藏了你要用的
以不同的方式重命名或添加
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++ 中实现 class 继承,但它的工作方式显然与 Python 中的非常不同。
现在,我有两个 classes,一个叫做 Player
,它是基础 class,另一个叫做 HumanPlayer
,它是子[=50] =].
Player
class 是一个抽象 class 有两种工作方式。
首先是它的行为像一个单例。它有一个名为 make_move
的静态函数,人们可以用 int
和 TicTacToeGame&
来调用它,它会为以 int
作为玩家编号的玩家走一步在 TicTacToe
.
第二个是它作为 class 来创建玩家编号为 属性 的对象。所以,如果你用 class 构造一个对象,你应该得到一个 player_number
属性 的对象。然后,如果您在对象上仅使用 TicTacToeGame&
调用 make_move
函数,它将自动插入其玩家编号并使用静态 class 方法在游戏中进行移动。
我想要 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;
}
我最近了解到 subclasses 不继承构造函数,所以事实证明我必须同时编写一个新的静态函数和一个构造函数,我已经完成了。
但是,每当我初始化一个新的 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
class 以与 Player
class 相同的方式工作?
同名静态函数的重定义隐藏了你要用的
以不同的方式重命名或添加
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
};