试图创建一个自定义字符串类时,我不断收到C2440和E0415错误



我在自学。我正在使用一本书中的这个例子来处理一个自定义字符串类,并且我一直在获得

错误(活动(E0415不存在合适的构造函数从"0"转换为"0";const-char[15]";至";Stringz";和错误C2440"初始化":无法从"const char[15]"转换为"Stringz">

请帮我理解出了什么问题。我在私有字段中有一个指向char的指针。构造函数使用从main发送的任何内容作为参数进行初始化,参数的长度被用来动态分配适当的内存量,最后地址被放在private字段的*str中。我试着推杆。任何输入都值得赞赏

#include <iostream>
using namespace std;
class Stringz
{
private:
char* str;
public:
Stringz(char* s)
{
int length = strlen(s);
str = new char[length + 1];
strcpy(str, s);
}
~Stringz()
{
cout << "deleting.." << endl;
delete[]str;
}
void display()
{
cout << str << endl;
}
};
int main()
{

Stringz s1 = "made a string ";
s1.display();
return 0;
}

在C++中,char*const char*类型是不同的。字符串文字是charconst数组,因此它可以"衰减"为const char*,但不能char*(否则,函数可能会尝试修改其内容,这是不允许的(。

要从该文本中获取Stringz,您需要使构造函数接受const char*参数:

Stringz(const char* s)
{
int length = strlen(s);
str = new char[length + 1];
strcpy(str, s);
}

您仍然可以使用此构造函数从-constchar数组生成Stringz,因为编译器可以安全地将非const强制转换为const。(当然,这是假设构造函数没有做任何事情来试图修改它给出的参数,而你的构造函数没有。(

  • 您肯定需要将字符串的长度存储为私有字段(或者每次都需要重新计算(
  • 您在构造函数中接受char*,但字符串文字的类型为const char *,这不适合预期使用char*

!最初答案的错误部分

= "made a string "正在调用一个您没有编写的赋值运算符(也称为operator=(。要调用构造函数,可以使用Stringz s1("made a string ")String s1{"made a string "},但代码中的问题不止于此:

最新更新