【问题标题】:how can I create an superclass object within interface class?如何在接口类中创建超类对象?
【发布时间】:2019-09-27 11:19:13
【问题描述】:

我得到了一个接口 (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 时,为什么要创建game_manager
  • 说实话我也不知道为什么我需要这样做。在高级编程课程中,他们要求实现一个接口,因此,如果他们用测试 main 更改 main,程序仍然可以工作。 API编程的某种介绍。他们提供了游戏管理器标题。
  • 试试game_manager game = Game();
  • @KorelK 我仍然收到“未定义的引用”错误
  • @M12421K 你有一个Game.cpp 文件,其中包含Game.h 中的函数的实现吗?并且你在main.cpp#include "Game.h"中添加了吗?

标签: c++ oop inheritance interface


【解决方案1】:

我认为他们希望你做的是

game_manager *game = new Game();

然后打一堆game-&gt;add_XXX 电话。这是通过其接口使用具体类的教科书示例。但这只有在 game_manager 类中声明函数 virtual 时才有效;他们不是。

【讨论】:

  • 除了接口省略了声明virtual方法,或者纯virtual方法。很奇怪。
  • 对...那为什么 OP 还需要 Game 类呢?
  • @M12421K • 我怀疑你被教导“如何用 C++ 糟糕地编程”。如果您使用的是网站,我会考虑其他选择。如果你在课堂上,我的同情。如果它来自一本书,请考虑以下一本好书:stackoverflow.com/questions/388242/…
【解决方案2】:

您应该为类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 对象并将其存储在game_manager 变量中,而不是创建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,因此这是我能想到的唯一方法。 :)

【讨论】:

    【解决方案3】:

    您只需在界面中使用virtual 函数即可。

    class inter {
    public:
        virtual void interface_function() = 0; // Pure virtual function
        virtual void interface_function2() { // Virtual function
            cout << "I am ***inter***::interface_function2" << endl;
        }
    };
    
    class use_inter : public inter {
    public:
        void interface_function() { // Override inter::interface_function
            cout << "I am use_inter::interface_function" << endl;
        }
        void interface_function2() { // Override inter::interface_function2
            cout << "I am use_inter::interface_function2" << endl;
        }
    };
    
    class use_inter2 : public inter {
    public:
        // Because we don't override a pure virtual function, this class is abstract too.
    };
    
    class use_inter3 : public inter {
    public:
        void interface_function() { // Override inter::interface_function
            cout << "I am use_inter3::interface_function" << endl;
        }
        // Here we don't override a regular virtual function, so in call from this object type to "interface_function2", the implementation of inter::interface_function2 will be execute.
    };
    
    int main() {
        use_inter ui1;
        //use_inter2 ui2; // Compiler error: use_inter2 is an abstract class.
        use_inter3 ui3;
        ui1.interface_function(); // Prints: I am use_inter::interface_function
        ui3.interface_function(); // Prints: I am use_inter3::interface_function
        ui1.interface_function2(); // Prints: I am use_inter::interface_function2
        ui3.interface_function2(); // Prints: I am ***inter***::interface_function2
    
        cout << endl << "==============================" << endl << endl;
    
        inter *interface = new use_inter();
    
        interface->interface_function(); // Prints: I am use_inter::interface_function
        interface->interface_function2(); // Prints: I am use_inter::interface_function2
    
        delete interface;
    
        cout << endl << "==============================" << endl << endl;
    
        interface = new use_inter3();
    
        interface->interface_function(); // Prints: I am use_inter3::interface_function
        interface->interface_function2(); // Prints: I am ***inter***::interface_function2
    
        delete interface;
        return 0;
    }
    
    ----- Output:
    
    I am use_inter::interface_function
    I am use_inter3::interface_function
    I am use_inter::interface_function2
    I am ***inter***::interface_function2
    
    ==============================
    
    I am use_inter::interface_function
    I am use_inter::interface_function2
    
    ==============================
    
    I am use_inter3::interface_function
    I am ***inter***::interface_function2
    

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多