祁映 发表于 2020-2-22 22:12:22

用成员函数重载运算符

#include<iostream>
using namespace std;
#include<string.h>
class String
{
        char name;
public:
        String(char*str)
        {
                strcpy(name, str);//1
        }
        String() { }
        ~String() { }
        String operator+(const String&);
        void display()
        {
                cout << "The string is :" << name << endl;
        }
};

static char* str;

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

        return String(str);
}

void main()
{
        str = new char;
        String demo1("Visual c++");      //没有与参数列表匹配的构造函数 "String::String" 实例
                                                    //“String::String(const String &)”: 无法将参数 1 从“const char”转换为“char *”
        String demo2("6.0");                //没有与参数列表匹配的构造函数 "String::String" 实例
                                                     //“String::String(const String &)”: 无法将参数 1 从“const char”转换为“char *”

        demo1.display();
        demo2.display();
        String demo3 = demo1 + demo2;
        demo3.display();
        String demo4 = demo3 + "Programming.";//没有与这些操作数匹配的 "+" 运算符
                                                    //        二进制“ + ”: 没有找到接受“const char”类型的右操作数的运算符(或没有可接受的转换)
        demo4.display();
        delete str;
}

这个能在VC6.0中不出错,在VS2017就出现上面的问题
请问该怎么修改?

major_lyu 发表于 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能存放的字符数目.

你再好好检查一下

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

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

static char* str;

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

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

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

祁映 发表于 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);还是错,而且运行结果只有一半。

祁映 发表于 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);还是错,而且运行结果只有一半。

祁映 发表于 2020-2-22 23:38:03

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

感谢,问题已解决。谢谢你!

major_lyu 发表于 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的第二个参数不是目标字符串当前长度,而应该是目标字符串的最大容量,是防止字符串拼接后的长度超过目标字符串的最大长度而发生溢出的。

祁映 发表于 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,结果也是一样。总之,非常感谢你!
页: [1]
查看完整版本: 用成员函数重载运算符