错误:请求从“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 &lt;&lt; str1 &lt;&lt; endl;这段代码会打印“1234”但我想要“abc”。 @FreezingLeaf 你没有为string 成员分配任何内存

以上是关于错误:请求从“const char [5]”转换为非标量类型“String”的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ConstraintViolationException 500 错误转换为 400 错误请求?

无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]

Azure 流分析 CreateOrReplace 转换冲突或错误请求

无法从字符串转换为 NewtonSoft.Json.JsonReader

在 Spring Boot jpa 中将延迟加载的对象转换为 JSON

如何将 MongoDB 文档转换为 JSON 对象