如何让一个函数参数接受不同的对象(但属于同一类),并访问传递给w/n函数调用的w/n对象的函数

c++ How to have a function parameter take different objects (but of same class) and access the functions of w/e object passed w/n function call?

本文关键字:函数 对象 访问 函数调用 一类 参数 一个 属于      更新时间:2023-10-16

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

In 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。我真的很困惑,因为我显然把它作为一个参数传入。

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

    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语句中,我将子对象的地址放入父类型Creature的player1creature中时,我不只是将其所有内容放入player1creature并覆盖player1creature中的所有内容。相反,我只是传递地址(希望?),所以它也保留了所有的父函数。然后,我将父对象传递给函数execute_battle,该函数将创建该对象的本地副本(对吗)?这是我认为正在发生的事情,但如果我有什么错,我不会感到惊讶。

我也试过在其他地方使用指针和引用,但事情很快就变得非常混乱。让我知道,如果我可以提供更多的代码以某种方式。

谢谢!

您尝试实现的是多态性。

你应该这样做:

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

Creature* player1creature;
Creature* player2creature;

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

一旦你有了这些,多态性就可以工作了(也就是说,调用虚函数)通过在vtable中查找正确的函数,可以动态地解决直接或间接使用非虚拟接口习惯用法的问题。

2。然后,在函数execute_battle中,出于同样的原因,您必须将指针传递给类型为Creature的对象(您可以传递指针,也可以传递指向const的指针,这取决于您想做什么)

因此,用下列方式声明你的函数:

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的成员函数,并且多态性可以工作。

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

所以这里是我的评论作为一个答案:修复你的execute_battle()函数的错字。参数声明为p1_creature,但有时您使用pl_creaturel代替1