1

我正在尝试将对象传递给函数,但要传递的对象将取决于用户输入。我不知道该怎么做。

在 int main(){

我已经声明了四个子类类型的对象:

Human Kite(20, 100, "Kite"); Cyberdemon Ky(20, 100, "Ky Ky"); Balrogs Xor(20, 100, "HaXoR"); Elf Peet(20, 100, "Peet"); 

然后根据用户输入,我将四个对象之一传入 Creature 类型的对象,即父类。

int player_creature_switch;
Creature player1creature;
Creature player2creature;

cout << "Player 1 choose your class: (1) Human (2) Cyberdemon (3) Balrogs (4) Elf" << endl;
cin >> player_creature_switch;
        switch(player_creature_switch){
        case 1:
            player1creature = Kite;
            break;
        case 2:
            player1creature = Ky;
            break;
        case 3:
            player1creature = Xor;
            break;
        case 4:
            player1creature = Peet;
            break;
        default:

            break;
    }

cout << "Player 2 choose your class: (1) Human (2) Cyberdemon (3) Balrogs (4) Elf" << endl;
cin >> player_creature_switch;
switch(player_creature_switch){
        case 1:
            player2creature = Kite;
            break;
        case 2:
            player2creature = Ky;
            break;
        case 3:
            player2creature = Xor;
            break;
        case 4:
            player2creature = Peet;
            break;
        default:

            break;
    }

execute_battle(player1creature, player2creature);

return 0;

}

然后我希望将持有四个子类对象中的任何一个的两个 Creature 对象传递给一个函数,execute_battle,它将访问作为参数传入的对象的成员函数。

void execute_battle(Creature& pl_creature, Creature& p2_creature){
        cout << pl_creature.getType() << p1_creature.getName() << "has entered the        fray!";

  .... more code.... 
    }

我的头文件和我的基/子类设置得很好。我知道这一点,因为如果我不将对象传递给函数,我的成员函数在 main 中工作正常。我也有我的函数协议等。我知道我没有正确传递对象或访问函数中的成员函数execute_battle,因为目前我遇到了各种错误,例如In function execute_battle: p1_creature was not declared in this scope. 我真的很困惑,因为我清楚地把它作为论据传递了。

我还尝试在函数中创建另一个 Creature 实例:

    void execute_battle(Creature& pl_creature, Creature& p2_creature){
        Creature p1_creat = p1_creature;
        cout << pl_creat.getType() << p1_creat.getName() << "has entered the fray!";
}

但无济于事。我怎么能这样做? 更重要的是,有人可以根据正在传递的对象的引用/地址来解释发生了什么吗?

例如,我知道,当我在 switch 语句中将子对象的地址放入player1creature父类型 Creature 中时,我不仅仅是将其所有内容放入player1creature并覆盖player1creature. 相反,我只是传递地址(希望如此?)所以它也保留了所有父函数。然后,我将父对象传递给函数execute_battle,函数将创建该对象的本地副本(对)?这就是我认为正在发生的事情,但如果我有什么问题,我不会感到惊讶。

我也尝试在其他地方使用指针和引用,但事情很快就变得非常混乱。如果我能以某种方式提供更多代码,请告诉我。

谢谢!

4

2 回答 2

1

你试图实现的是多态性。

这是你应该做的:

1.将你的生物变量声明为指针:

Creature* player1creature;
Creature* player2creature;

只有这样,您才能存储派生对象。我什至不知道您的代码是如何以这种方式编译的(将派生对象分配给基础对象)。这是无法做到的,因为当你以Creature这种方式声明一个类型的对象时 : Creature myCreature,你告诉编译器“为一个类型的对象保留位置Creature”,编译器可以通过类声明知道这个对象的大小。您不能直接分配派生类型的对象,因为它们的内存布局不一样(通常,它更大,因为派生类添加了东西)。

一旦你掌握了这些,多态性就可以工作了(也就是说,通过在 中查找vtable正确的函数,直接或间接地使用非虚拟接口惯用语对虚拟函数的调用将被动态解析)。

2.然后,在您的函数中,出于同样的原因execute_battle,您必须将指针传递给类型对象Creature(您可以传递指针或指向常量的指针,具体取决于您想要做什么)

因此,使用以下之一声明您的函数:

void execute_battle(Creature* p1_creature, Creature* p2_creature){}
void execute_battle(const Creature* p1_creature, const Creature* p2_creature){}

(并且如评论中所述,避免拼写错误,这应该可以防止not declared in this scope错误)。

您现在可以调用成员函数,Creature并且多态性将起作用。

然后,关于参数传递方法,我建议你阅读不同的可能性

于 2013-05-26T00:00:56.453 回答
1

所以这是我的评论作为答案:修复execute_battle()函数中的错字。该参数被声明为,p1_creature但有时您使用pl_creaturel不是1

于 2013-05-26T15:06:05.830 回答