首页 > 解决方案 > 如何在接口类中创建超类对象?

问题描述

我得到了一个接口(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

标签: c++oopinheritanceinterface

解决方案


您应该为类中的方法定义一个虚拟主体,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,这是我能想到的唯一方法。:)


推荐阅读