【问题标题】:error: conversion from ‘const char [5]’ to non-scalar type ‘String’ requested错误:请求从“const char [5]”转换为非标量类型“String”
【发布时间】:2020-06-17 04:56:16
【问题描述】:

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

错误:请求从“const char [5]”转换为非标量类型“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";

标签: c++


【解决方案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 成员分配任何内存
    猜你喜欢
    • 2021-09-16
    • 2014-12-20
    • 2020-02-03
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多