如何让一个函数参数接受不同的对象(但属于同一类),并访问传递给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?
我正在尝试将对象传递到函数中,但是要传递的对象将取决于用户输入。我不知道该怎么做。
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_creature
与l代替1
- 如何使用单独文件中的派生类访问友元函数对象
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 有没有办法将重载的类函数绑定到函数对象?
- 将指针传递到成员的指针,从模板参数包到函数对象
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 如何通过接口将函子分配给函数对象
- 对std::函数对象的调用不匹配,该对象是指向成员函数的指针
- 指向std::invoke中成员函数对象的指针
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- "std::function"的简单版本:函数对象的生存期?
- C++ 将函数对象作为左值和/或右值传递
- SFINAE 用于具有默认参数的函数对象
- 构造函数对象赋值是否泄漏内存
- 如何发送通过绑定到函数/方法创建的函数对象?
- std::for_each 与函数对象
- 将函数对象传递给 std::function
- 访问执行策略for_each函数对象中的迭代器
- 通过C++函数对象类访问参数