鱼C论坛

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

[已解决]用成员函数重载运算符

[复制链接]
发表于 2020-2-22 22:12:22 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<iostream>
  2. using namespace std;
  3. #include<string.h>
  4. class String
  5. {
  6.         char name[256];
  7. public:
  8.         String(char*str)
  9.         {
  10.                 strcpy(name, str);//1
  11.         }
  12.         String() { }
  13.         ~String() { }
  14.         String operator+(const String&);
  15.         void display()
  16.         {
  17.                 cout << "The string is :" << name << endl;
  18.         }
  19. };

  20. static char* str;

  21. String String::operator+(const String& a)
  22. {
  23.         strcpy(str, name);   //2
  24.         strcat(str, a.name);//3     1、2、3错误提示: 不安全,建议用strcpy_s、stracat_s替换。我替换后,错误提示://没有与参数列表匹配的 重载函数 "strcpy_s" 实例       
  25.                                                                                                                                                                     // “strcpy_s” : 函数不接受 2 个参数       
  26.                                    //strcat也一样

  27.         return String(str);
  28. }

  29. void main()
  30. {
  31.         str = new char[256];
  32.         String demo1("Visual c++");      //没有与参数列表匹配的构造函数 "String::String" 实例
  33.                                                       //“String::String(const String &)”: 无法将参数 1 从“const char[11]”转换为“char *”
  34.         String demo2("6.0");                //没有与参数列表匹配的构造函数 "String::String" 实例
  35.                                                      //“String::String(const String &)”: 无法将参数 1 从“const char[4]”转换为“char *”

  36.         demo1.display();
  37.         demo2.display();
  38.         String demo3 = demo1 + demo2;
  39.         demo3.display();
  40.         String demo4 = demo3 + "Programming.";//没有与这些操作数匹配的 "+" 运算符
  41.                                                     //        二进制“ + ”: 没有找到接受“const char[13]”类型的右操作数的运算符(或没有可接受的转换)
  42.         demo4.display();
  43.         delete str;
  44. }
复制代码

这个能在VC6.0中不出错,在VS2017就出现上面的问题
请问该怎么修改?
最佳答案
2020-2-22 23:04:25
本帖最后由 major_lyu 于 2020-2-22 23:49 编辑

你修改后的代码啥样子?是不是strcpy_s 和strcat_s两个函数参数没给对?
这两个函数都需要输入三个参数的.
strcpy_s(s1, n, s2); 将字符串s2的内容复制到字符串s1中, n位需要复制的字符数.通常为strlen(s2)+1;
strcat_s(st1,n,str2);将str2的内容拼接到str1. 参数n表示字符串str1能存放的字符数目.

你再好好检查一下

这是我帮你修改后的代码:

  1. #include<iostream>
  2. using namespace std;
  3. #include<string.h>
  4. class String
  5. {
  6.         char name[256];
  7. public:
  8.         String(const char str[])  // 参数修改为const char  str[]; 不让代用String("XXXX"),会有报错或者warning。因为双引号定义的字符串常量“xxxxzx”的首地址是字符串常量指针
  9.         {
  10.                 strcpy_s(name, strlen(str)+1, str);//1  //////正确的调用strcpy_s()
  11.         }
  12.         String() { }
  13.         ~String() { }
  14.         String operator+(const String&);
  15.         void display()
  16.         {
  17.                 cout << "The string is :" << name << endl;
  18.         }
  19. };

  20. static char* str;

  21. String String::operator+(const String& a)
  22. {
  23.         strcpy_s(str,strlen(name)+1, name);   //2  //////正确的调用strcpy_s()
  24.         strcat_s(str,256, a.name);//3     //////正确的调用strcat_s(); 第二个参数256是目标字符串的容量,你main()中定义的是256,所以我就写了这个。  
  25.         return String(str);
  26. }

  27. int main()    // 规范写法
  28. {
  29.         str = new char[256];
  30.         String demo1("Visual c++");      //没有与参数列表匹配的构造函数 "String::String" 实例
  31.         //“String::String(const String &)”: 无法将参数 1 从“const char[11]”转换为“char *”   ------------//将构造函数修改为String(const char* str)或者String(const char str[])
  32.         String demo2("6.0");                //没有与参数列表匹配的构造函数 "String::String" 实例
  33.        //“String::String(const String &)”: 无法将参数 1 从“const char[4]”转换为“char *”      -----------------同上

  34.         demo1.display();
  35.         demo2.display();
  36.         String demo3 = demo1 + demo2;
  37.         demo3.display();
  38.         String demo4 = demo3 + " Programming.";    //没有与这些操作数匹配的 "+" 运算符
  39.         demo4.display();
  40.         delete str;
  41.         return 0;     //规范写法
  42. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-22 23:04:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 major_lyu 于 2020-2-22 23:49 编辑

你修改后的代码啥样子?是不是strcpy_s 和strcat_s两个函数参数没给对?
这两个函数都需要输入三个参数的.
strcpy_s(s1, n, s2); 将字符串s2的内容复制到字符串s1中, n位需要复制的字符数.通常为strlen(s2)+1;
strcat_s(st1,n,str2);将str2的内容拼接到str1. 参数n表示字符串str1能存放的字符数目.

你再好好检查一下

这是我帮你修改后的代码:

  1. #include<iostream>
  2. using namespace std;
  3. #include<string.h>
  4. class String
  5. {
  6.         char name[256];
  7. public:
  8.         String(const char str[])  // 参数修改为const char  str[]; 不让代用String("XXXX"),会有报错或者warning。因为双引号定义的字符串常量“xxxxzx”的首地址是字符串常量指针
  9.         {
  10.                 strcpy_s(name, strlen(str)+1, str);//1  //////正确的调用strcpy_s()
  11.         }
  12.         String() { }
  13.         ~String() { }
  14.         String operator+(const String&);
  15.         void display()
  16.         {
  17.                 cout << "The string is :" << name << endl;
  18.         }
  19. };

  20. static char* str;

  21. String String::operator+(const String& a)
  22. {
  23.         strcpy_s(str,strlen(name)+1, name);   //2  //////正确的调用strcpy_s()
  24.         strcat_s(str,256, a.name);//3     //////正确的调用strcat_s(); 第二个参数256是目标字符串的容量,你main()中定义的是256,所以我就写了这个。  
  25.         return String(str);
  26. }

  27. int main()    // 规范写法
  28. {
  29.         str = new char[256];
  30.         String demo1("Visual c++");      //没有与参数列表匹配的构造函数 "String::String" 实例
  31.         //“String::String(const String &)”: 无法将参数 1 从“const char[11]”转换为“char *”   ------------//将构造函数修改为String(const char* str)或者String(const char str[])
  32.         String demo2("6.0");                //没有与参数列表匹配的构造函数 "String::String" 实例
  33.        //“String::String(const String &)”: 无法将参数 1 从“const char[4]”转换为“char *”      -----------------同上

  34.         demo1.display();
  35.         demo2.display();
  36.         String demo3 = demo1 + demo2;
  37.         demo3.display();
  38.         String demo4 = demo3 + " Programming.";    //没有与这些操作数匹配的 "+" 运算符
  39.         demo4.display();
  40.         delete str;
  41.         return 0;     //规范写法
  42. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 23:30:10 | 显示全部楼层
8 String(const char*str)
25 strcpy_s(str,strlen(str)+1, name);
26 strcat_s(str,256, a.name);
看了你回复后,修改成上面的,现在结果是运行出来了,可是提示还是错误,返回值不是0.
之后 26 strcat_s(str,strlen(str)+1, a.name);还是错,而且运行结果只有一半。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 23:30:49 | 显示全部楼层
major_lyu 发表于 2020-2-22 23:04
你修改后的代码啥样子?是不是strcpy_s 和strcat_s两个函数参数没给对?
这两个函数都需要输入三个参数的.
...

8 String(const char*str)
25 strcpy_s(str,strlen(str)+1, name);
26 strcat_s(str,256, a.name);
看了你回复后,修改成上面的,现在结果是运行出来了,可是提示还是错误,返回值不是0.
之后 26 strcat_s(str,strlen(str)+1, a.name);还是错,而且运行结果只有一半。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 23:38:03 | 显示全部楼层
major_lyu 发表于 2020-2-22 23:04
你修改后的代码啥样子?是不是strcpy_s 和strcat_s两个函数参数没给对?
这两个函数都需要输入三个参数的.
...

感谢,问题已解决。谢谢你!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 23:42:23 | 显示全部楼层
祁映 发表于 2020-2-22 23:30
8 String(const char*str)
25 strcpy_s(str,strlen(str)+1, name);
26 strcat_s(str,256, a.name);

我给你的代码是跑通了的。哈哈。最后是啥问题呢?
strcat_s的第二个参数不是目标字符串当前长度,而应该是目标字符串的最大容量,是防止字符串拼接后的长度超过目标字符串的最大长度而发生溢出的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 23:58:28 | 显示全部楼层
major_lyu 发表于 2020-2-22 23:42
我给你的代码是跑通了的。哈哈。最后是啥问题呢?
strcat_s的第二个参数不是目标字符串当前长度,而应该 ...

1 strcpy_s(str,strlen(str)+1, name);
2 strcat_s(str,1000, a.name);
1那里没看仔细,修改成上面的,之后改成     strcpy_s(str,strlen(name)+1, name);     就没问题了。
strcat_s(str,256, a.name);    换成 256,结果也是一样。总之,非常感谢你!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 23:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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