错误:请求从"常量字符 [5]"转换为非标量类型"字符串"

error: conversion from ‘const char [5]’ to non-scalar type ‘String’ requested

本文关键字:quot 转换 字符串 类型 标量 字符 请求 常量 错误      更新时间:2023-10-16

我正在尝试创建一个可以由operator=分配的类String。但是编译器显示一个错误:

错误:请求从"常量字符 [5]"转换为非标量类型"字符串">

谁能帮我修复它?

#include <iostream>
using namespace std;
class String
{
private:
char string[];
public:
void operator=(const char str[])
{
for (int i = 0; ; i++) {
if (str[i] == '') {
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=。它只是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] = '';
} 
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;
}

但是,在这种情况下,使用动态分配的数组比使用固定数组更有意义。请务必遵循 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 != '')) {
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;
}

您需要向类添加一个 ctor。 您正在使用赋值运算符来尝试构造字符串对象。 将此添加到您的课程中。

String(const char str[]) {
for (int i = 0; ; i++) {
if (str[i] == '') {
string[i] = str[i];
break;
} else {
string[i] = str[i];
}
}
}