c++ - 如何在接口类中创建超类对象?
问题描述
我得到了一个接口(game_manager),我可以编写方法的主体,但不能向其中添加任何内容。我需要从接口获取我的超类输入。
我有一个名为 Game 的超类,它继承自 game_manager。
game_manager.h : (界面)
class game_manager
{
public:
void add_team_A_goalkeeper(int stamina, int dribble, int pass, int defend);
void add_team_A_defender(int stamina, int dribble, int pass, int defend);
void add_team_A_striker(int stamina, int dribble, int pass, int defend);
void add_team_B_goalkeeper(int stamina, int dribble, int pass, int defend);
void add_team_B_defender(int stamina, int dribble, int pass, int defend);
void add_team_B_striker(int stamina, int dribble, int pass, int defend);
void play();
string get_result();
private:
};
类游戏:
class Game : public game_manager
{
private:
bool Awin;
bool Bwin;
std::string result;
GoalKeeper AGoalKeeper;
Defender ADefender;
Striker AStriker;
GoalKeeper BGoalKeeper;
Defender BDefender;
Striker BStriker;
public:
void add_team_A_goalkeeper(int stamina, int dribble, int pass, int defend);
void add_team_A_defender(int stamina, int dribble, int pass, int defend);
void add_team_A_striker(int stamina, int dribble, int pass, int defend);
void add_team_B_goalkeeper(int stamina, int dribble, int pass, int defend);
void add_team_B_defender(int stamina, int dribble, int pass, int defend);
void add_team_B_striker(int stamina, int dribble, int pass, int defend);
void play();
std::string get_result();
void handle_encounter();
};
主要的:
#include "game_manager.h"
int main()
{
game_manager game = game_manager();
game.add_team_A_goalkeeper(100, 10, 20, 65);
game.add_team_A_defender(100, 20, 60, 80);
game.add_team_A_striker(100, 70, 50, 30);
game.add_team_B_goalkeeper(100, 50, 40, 50);
game.add_team_B_defender(100, 85, 20, 90);
game.add_team_B_striker(100, 50, 20, 10);
game.play();
std::cout << game.get_result();
}
当我创建一个 game_manager 对象时,我希望它从 Game 中创建一个对象并从 Game 类中调用重写的方法。我不知道如何实现它。
现在我得到这个错误:
/tmp/ccN3ZkwD.o: In function `main':
game.cpp:(.text+0x1635): undefined reference to `game_manager::add_team_A_goalkeeper(int, int, int, int)'
collect2: error: ld returned 1 exit status
解决方案
您应该为类中的方法定义一个虚拟主体,game_manager
以避免出现未定义的引用错误。它可以是这样的:
void game_manager::add_team_A_goalkeeper(int stamina, int dribble, int pass, int defend) {}
void game_manager::add_team_A_defender(int stamina, int dribble, int pass, int defend) {}
void game_manager::add_team_A_striker(int stamina, int dribble, int pass, int defend) {}
void game_manager::add_team_B_goalkeeper(int stamina, int dribble, int pass, int defend) {}
void game_manager::add_team_B_defender(int stamina, int dribble, int pass, int defend) {}
void game_manager::add_team_B_striker(int stamina, int dribble, int pass, int defend) {}
正如@KorelK 所提到的game_manager
,您应该创建一个Game
对象并将其存储在一个game_manager
变量中,而不是创建一个对象:
game_manager game = Game();
但是,当您调用game.add_team_A_goalkeeper(100, 10, 20, 65);
或其他game_manager
方法时,它将执行game_manager
的虚拟方法。为了调用Game
的方法,您需要将game_manager
对象存储到Game
指针并从该指针调用函数:
game_manager game = Game();
Game * game_ptr = (Game *) &game;
game_ptr->add_team_A_goalkeeper(100, 10, 20, 65);
这是一种相当老套的方法,但由于赋值要求game
变量类型为game_manager
,这是我能想到的唯一方法。:)
推荐阅读
- javascript - WebChat 如何为发送方/接收方设置 CSS 颜色
- file - 批处理脚本不使用此代码输出文件
- php - woocomerce:状态完成后获取自定义产品输入字段的单个值
- javascript - 如何将参数从一个html页面传递到另一个页面
- c++ - 为什么我的 iFFT 图像带有镜像副本?
- matlab - 文件路径 MATLAB
- c++ - 如何从库路径自动编译源文件而不生成 .o、.a 和 .so 文件?
- python - 如何在不使用 Pandas 的情况下在 Python 中找到 52 周的高点
- amazon-web-services - 为什么我的 S3 生命周期策略没有生效?
- c# - 使用 Embeddinator-4000 在 Android 中无法访问函数