错误:请求从“const char [5]”转换为非标量类型“String”
Posted
技术标签:
【中文标题】错误:请求从“const char [5]”转换为非标量类型“String”【英文标题】:error: conversion from ‘const char [5]’ to non-scalar type ‘String’ requested 【发布时间】:2020-06-17 04:56:16 【问题描述】:我正在尝试创建一个可以由operator=
分配的类String
。但是编译器显示错误:
谁能帮我解决它?
#include <iostream>
using namespace std;
class String
private:
char string[];
public:
void operator=(const char str[])
for (int i = 0; ; i++)
if (str[i] == '\0')
string[i] = str[i];
break;
else
string[i] = str[i];
friend ostream &operator<<(ostream &output, const String& str)
output << str.string;
return output;
;
int main()
String str1 = "test";
cout << str1 << endl;
【问题讨论】:
String str1 = "test";
不是operator=
,它是构造函数。您必须使用参数 const char str[]
添加构造函数或编写 String str1; str1 = "test";
【参考方案1】:
String str1 = "test";
根本不使用operator=
。它只是String str1("test");
的语法糖,它使用您尚未定义的转换构造函数,因此会出现编译器错误。您需要添加这样的构造函数。
另外,char string[];
不是数组的有效变量声明。您需要为数组指定一个大小,然后确保类永远不会超过该大小。
例如
#include <iostream>
#include <cstring>
using namespace std;
class String
private:
char string[256];
public:
String(const char *str = NULL)
if (str) strncpy(string, str, sizeof(string)-1);
string[sizeof(string)-1] = '\0';
String& operator=(const String &str)
if (this != &str)
memcpy(string, str.string, sizeof(string));
return *this;
friend ostream& operator<<(ostream &output, const String& str)
output << str.string;
return output;
;
int main()
String str1 = "test";
cout << str1 << endl;
但是,在这种情况下,使用动态分配的数组比使用固定数组更有意义。请务必按照Rule of 3 进行正确的内存管理。
试试这个:
#include <iostream>
#include <cstring>
using namespace std;
class String
private:
char *string;
int length;
int capacity;
public:
String(const char *str = NULL)
: string(NULL), length(0), capacity(0)
if ((str) && (*str != '\0'))
length = capacity = strlen(str);
string = new char[length + 1];
memcpy(string, str, length + 1);
String(const String &str)
: string(NULL), length(0), capacity(0)
if (str.string)
length = capacity = str.length;
string = new char[length + 1];
memcpy(string, str.string, length + 1);
~String()
delete[] string;
String& operator=(const String &str)
if (this != &str)
int len = str.length;
if (capacity >= len)
memcpy(string, str.string, len + 1);
else
int cap = int(double(len) * 1.5);
char *temp = new char[cap + 1];
memcpy(temp, str.string, len + 1);
delete[] string;
string = temp;
capacity = cap;
length = len;
return *this;
friend ostream& operator<<(ostream &output, const String& str)
if (str.string)
output.write(str.string, str.length);
return output;
;
int main()
String str1 = "test";
cout << str1 << endl;
【讨论】:
【参考方案2】:您需要为您的班级添加一个演员。您正在使用赋值运算符来尝试构造您的 String 对象。将此添加到您的课程中。
String(const char str[])
for (int i = 0; ; i++)
if (str[i] == '\0')
string[i] = str[i];
break;
else
string[i] = str[i];
【讨论】:
您确定string
将有足够的空间分配给它吗?老实说,我只是让string
成员成为std::string
谢谢!但是在我做了这样的事情之后,我又遇到了麻烦。String str1 = "abc";String str2 = "1234";cout << str1 << endl;
这段代码会打印“1234”但我想要“abc”。
@FreezingLeaf 你没有为string
成员分配任何内存以上是关于错误:请求从“const char [5]”转换为非标量类型“String”的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ConstraintViolationException 500 错误转换为 400 错误请求?
无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]
Azure 流分析 CreateOrReplace 转换冲突或错误请求
无法从字符串转换为 NewtonSoft.Json.JsonReader