鱼C论坛

 找回密码
 立即注册
查看: 1134|回复: 6

[已解决]C++第6节课后作业疑问

[复制链接]
发表于 2023-6-10 00:06:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼老师要求写一个calc的函数
当传入1个参数的时候,返回它的平方
2个的时候,返回它俩相乘
3个的时候,返回它们3个相加

然后我写的代码如下:
  1. #include <iostream>
  2. #include <math.h>

  3. double calc(double a1, double a2, double a3);

  4. int main(int argc, const char *argv[], const char *envp[])
  5. {
  6.     double a1, a2, a3;
  7.     int judge;
  8.     double answer;

  9.     std::cout << "请问要输入几个数? " << std::endl;
  10.     std::cin >> judge;

  11.     switch(judge)
  12.     {
  13.         case 1:
  14.         {
  15.             std::cin >> a1;
  16.             answer = calc(a1);
  17.             break;
  18.         }
  19.         case 2:
  20.         {
  21.             std::cin >> a1 >> a2;
  22.             answer = calc(a1, a2);
  23.             break;
  24.         }
  25.         case 3:
  26.         {
  27.             std::cin >> a1 >> a2 >> a3;
  28.             answer = calc(a1, a2, a3);
  29.             break;
  30.         }
  31.         default :
  32.         {
  33.             std::cout << "输入错误, 请重试! " << std::endl;
  34.             break;
  35.         }
  36.     }

  37.     std::cout << "计算后的值为: " << answer << std::endl;

  38.     system("pause");
  39.     return 0;
  40. }

  41. double calc(double a1)
  42. {
  43.     return pow(a1, 2);
  44. }

  45. double calc(double a1, double a2)
  46. {
  47.     return a1 * a2;
  48. }

  49. double calc(double a1, double a2, double a3)
  50. {
  51.     return a1 + a2 + a3;
  52. }
复制代码


编译的时候报错
  1. test02.cpp: In function 'int main(int, const char**, const char**)':
  2. test02.cpp:28:26: error: too few arguments to function 'double calc(double, double, double)'
  3.    28 |             answer = calc(a1);
  4.       |                      ~~~~^~~~
  5. test02.cpp:12:8: note: declared here
  6.    12 | double calc(double a1, double a2, double a3);
  7.       |        ^~~~
  8. test02.cpp:34:26: error: too few arguments to function 'double calc(double, double, double)'
  9.    34 |             answer = calc(a1, a2);
  10.       |                      ~~~~^~~~~~~~
  11. test02.cpp:12:8: note: declared here
  12.    12 | double calc(double a1, double a2, double a3);
  13.       |        ^~~~
复制代码


它的意思是说我声明函数的时候是3个参数,然后前两次调用都是1个,2个参数,不够。但是小甲鱼老师有讲说,可以根据参数的数量、类型进行重载,所以是可以根据1~3个参数来重载的呀。搞不懂了,百度说什么的都有,问问各位大神了。
最佳答案
2023-6-10 00:08:05
你的代码在大致上的逻辑是正确的,但是有一个小错误导致你不能正确编译。在你的代码中,你提前声明了  calc  函数是带有三个参数的,然后在后面你实现了三个参数的版本,但是你没有为只有一个或者两个参数的情况提前声明函数。

你需要在你的代码开始处声明所有的重载版本,而不仅仅是三个参数的版本,这样你的代码就能正确编译了。

修改后的代码如下:

  1. #include <iostream>
  2. #include <math.h>

  3. double calc(double a1);                   // 声明只有一个参数的版本
  4. double calc(double a1, double a2);        // 声明有两个参数的版本
  5. double calc(double a1, double a2, double a3);   // 声明有三个参数的版本

  6. int main(int argc, const char *argv[], const char *envp[])
  7. {
  8.     double a1, a2, a3;
  9.     int judge;
  10.     double answer;

  11.     std::cout << "请问要输入几个数? " << std::endl;
  12.     std::cin >> judge;

  13.     switch(judge)
  14.     {
  15.         case 1:
  16.         {
  17.             std::cin >> a1;
  18.             answer = calc(a1);
  19.             break;
  20.         }
  21.         case 2:
  22.         {
  23.             std::cin >> a1 >> a2;
  24.             answer = calc(a1, a2);
  25.             break;
  26.         }
  27.         case 3:
  28.         {
  29.             std::cin >> a1 >> a2 >> a3;
  30.             answer = calc(a1, a2, a3);
  31.             break;
  32.         }
  33.         default :
  34.         {
  35.             std::cout << "输入错误, 请重试! " << std::endl;
  36.             break;
  37.         }
  38.     }

  39.     std::cout << "计算后的值为: " << answer << std::endl;

  40.     system("pause");
  41.     return 0;
  42. }

  43. double calc(double a1)
  44. {
  45.     return pow(a1, 2);
  46. }

  47. double calc(double a1, double a2)
  48. {
  49.     return a1 * a2;
  50. }

  51. double calc(double a1, double a2, double a3)
  52. {
  53.     return a1 + a2 + a3;
  54. }
复制代码

这样你的函数重载就可以正确工作了。函数重载就是让同一个函数名称有多个实现版本,每个版本根据它的参数类型和数量的不同来区分。在你的代码中,你只声明了一个版本,这就是你的问题所在。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-10 00:07:39 | 显示全部楼层
根据您提供的代码,您的重载函数声明和定义是正确的。然而,编译器报错说在main函数中调用该函数时缺少参数。这是因为您重载的函数需要在调用时告诉编译器使用哪个函数,但在case 1和case 2中只使用了一个或两个参数来调用函数,而没有告诉编译器应该使用哪个函数。

为解决此问题,您可以在case 1和case 2中使用具有相同名称的不同函数,例如:

  1. double calc(double a1);
  2. double calc(double a1, double a2);
  3. double calc(double a1, double a2, double a3);

  4. double calc(double a1)
  5. {
  6.     return pow(a1, 2);
  7. }

  8. double calc(double a1, double a2)
  9. {
  10.     return a1 * a2;
  11. }

  12. double calc(double a1, double a2, double a3)
  13. {
  14.     return a1 + a2 + a3;
  15. }

  16. int main(int argc, const char *argv[], const char *envp[])
  17. {
  18.     double a1, a2, a3;
  19.     int judge;
  20.     double answer;

  21.     std::cout << "请问要输入几个数? " << std::endl;
  22.     std::cin >> judge;

  23.     switch(judge)
  24.     {
  25.         case 1:
  26.         {
  27.             std::cin >> a1;
  28.             answer = calc(a1);
  29.             break;
  30.         }
  31.         case 2:
  32.         {
  33.             std::cin >> a1 >> a2;
  34.             answer = calc(a1, a2);
  35.             break;
  36.         }
  37.         case 3:
  38.         {
  39.             std::cin >> a1 >> a2 >> a3;
  40.             answer = calc(a1, a2, a3);
  41.             break;
  42.         }
  43.         default :
  44.         {
  45.             std::cout << "输入错误, 请重试! " << std::endl;
  46.             break;
  47.         }
  48.     }

  49.     std::cout << "计算后的值为: " << answer << std::endl;

  50.     system("pause");
  51.     return 0;
  52. }
复制代码

这样可以确保具有正确参数数量和类型的函数被调用。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-10 00:08:05 | 显示全部楼层    本楼为最佳答案   
你的代码在大致上的逻辑是正确的,但是有一个小错误导致你不能正确编译。在你的代码中,你提前声明了  calc  函数是带有三个参数的,然后在后面你实现了三个参数的版本,但是你没有为只有一个或者两个参数的情况提前声明函数。

你需要在你的代码开始处声明所有的重载版本,而不仅仅是三个参数的版本,这样你的代码就能正确编译了。

修改后的代码如下:

  1. #include <iostream>
  2. #include <math.h>

  3. double calc(double a1);                   // 声明只有一个参数的版本
  4. double calc(double a1, double a2);        // 声明有两个参数的版本
  5. double calc(double a1, double a2, double a3);   // 声明有三个参数的版本

  6. int main(int argc, const char *argv[], const char *envp[])
  7. {
  8.     double a1, a2, a3;
  9.     int judge;
  10.     double answer;

  11.     std::cout << "请问要输入几个数? " << std::endl;
  12.     std::cin >> judge;

  13.     switch(judge)
  14.     {
  15.         case 1:
  16.         {
  17.             std::cin >> a1;
  18.             answer = calc(a1);
  19.             break;
  20.         }
  21.         case 2:
  22.         {
  23.             std::cin >> a1 >> a2;
  24.             answer = calc(a1, a2);
  25.             break;
  26.         }
  27.         case 3:
  28.         {
  29.             std::cin >> a1 >> a2 >> a3;
  30.             answer = calc(a1, a2, a3);
  31.             break;
  32.         }
  33.         default :
  34.         {
  35.             std::cout << "输入错误, 请重试! " << std::endl;
  36.             break;
  37.         }
  38.     }

  39.     std::cout << "计算后的值为: " << answer << std::endl;

  40.     system("pause");
  41.     return 0;
  42. }

  43. double calc(double a1)
  44. {
  45.     return pow(a1, 2);
  46. }

  47. double calc(double a1, double a2)
  48. {
  49.     return a1 * a2;
  50. }

  51. double calc(double a1, double a2, double a3)
  52. {
  53.     return a1 + a2 + a3;
  54. }
复制代码

这样你的函数重载就可以正确工作了。函数重载就是让同一个函数名称有多个实现版本,每个版本根据它的参数类型和数量的不同来区分。在你的代码中,你只声明了一个版本,这就是你的问题所在。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-10 00:09:44 | 显示全部楼层
isdkz 发表于 2023-6-10 00:08
你的代码在大致上的逻辑是正确的,但是有一个小错误导致你不能正确编译。在你的代码中,你提前声明了  calc ...

课堂演示中,两个参数在声明的时候都是double类型,重载的时候将其中一个改成了int,编译没报错,但是是不是都要重新声明一下会比较好?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-10 00:11:01 | 显示全部楼层
铭凡 发表于 2023-6-10 00:09
课堂演示中,两个参数在声明的时候都是double类型,重载的时候将其中一个改成了int,编译没报错,但是是 ...

在C++中,函数重载的关键是函数的参数类型和/或参数数量不同,函数的返回类型并不影响函数重载的判断。你可以定义两个参数类型或数量不同的函数,即使它们的返回类型相同,编译器也会将它们视为两个不同的函数。

但是,如果你要更改已经声明的函数的参数类型,你必须重新声明这个函数。如果你不重新声明,那么当你在调用这个函数时,编译器将会使用最初的声明,这可能会导致错误。

例如,如果你已经声明了这样的一个函数:

  1. void func(double a, double b);
复制代码


然后你在实现这个函数时更改了一个参数的类型:

  1. void func(double a, int b) {
  2.   // ...
  3. }
复制代码


那么当你在代码中调用  func(1.0, 2)  时,编译器会报错,因为它在寻找两个参数都是  double  类型的函数,而你给出的函数是一个  double  类型和一个  int  类型的参数。

所以,如果你要更改已经声明的函数的参数类型或数量,你应该重新声明这个函数,这样编译器才能正确的找到你实现的函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-10 00:13:02 | 显示全部楼层
isdkz 发表于 2023-6-10 00:11
在C++中,函数重载的关键是函数的参数类型和/或参数数量不同,函数的返回类型并不影响函数重载的判断。你 ...

明白啦。两次都是老哥解决的问题,非常感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-10 00:13:32 | 显示全部楼层
铭凡 发表于 2023-6-10 00:13
明白啦。两次都是老哥解决的问题,非常感谢!!!

不客气
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 02:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表