E0289 отсутствуют экземпляры конструктора "String::String", соответствующие списку аргументов

630
29 ноября 2021, 04:00

Source.cpp

#include <iostream>
#include "String.h"
using namespace std;
int main(){
cout << "Hello World!\n";
String str("HELLO");
cout << str;
return 0;
}

String.h

#pragma once
#include <iostream>
class String
{
private:
    char* str;
    int length;
public:
    String();
    String(char* str);
    String(const String& other);
    String(String&& other) noexcept;
    ~String();
    String& operator= (const String& other);
    String& operator+ (const String& other);
    char& operator[] (size_t i) const;
    friend bool operator== (const String& str, const String& other);
    friend bool operator!= (const String& str, const String& other);
    friend ostream& operator<<(ostream& out, const String& other)
    {
        return (out << other.str);
    }
    friend istream& operator>>(ostream& in, const String& other)
    {
        return (in >> other.str);
    }
    size_t Length();
    void show();
};

String.cpp

#include "String.h"
#include <iostream>
using namespace std;
String::String()
{
    str = nullptr;
    length = 0;
}
String::String(char* str)
{
    length = strlen(str);
    this->str = new char[length + 1];
    for (int i = 0; i < length; i++)
        this->str[i] = str[i];
    this->str[length] = '\0';
}
String::String(const String& other)
{
    if (str != nullptr)
        delete[] str;
    length = strlen(other.str);
    str = new char[length + 1];
    for (int i = 0; i < length; i++)
        str[i] = other.str[i];
    str[length] = '\0';
}
String::String(String&& other) noexcept
{
    length = other.length;
    str = other.str;
    other.str = nullptr;
}
String::~String()
{
    delete[] str;
}
void String::show()
{
    cout << str;
}
size_t String::Length() 
{
    return length;
}
bool operator== (const String& str, const String& other)
{
    if (str.length != other.length)
    {
        return false;
    }
    for (int i = 0; i < str.length; i++)
    {
        if (str[i] != other.str[i])
            return false;
    }
    return true;
}
bool operator!= (const String& str, const String& other)
{
    return !(operator==(str, other));
}
char& String::operator[] (size_t i) const
{
    return str[i];
}
String& String::operator= (const String& other)
{
    if (this->str != nullptr)
        delete[] str;
    length = strlen(other.str);
    this->str = new char[length + 1];
    for (int i = 0; i < length; i++)
        this->str[i] = other.str[i];
    this->str[length] = '\0';
    return *this;
}
String& String::operator+ (const String& other)
{
    String newStr;
    length = strlen(str) + strlen(other.str);
    newStr.str = new char[length + 1];
    int i = 0;
    for (i; i < strlen(str); i++)
        newStr.str[i] = str[i];
    for (int j = 0; j < strlen(other.str); i++, j++)
        newStr.str[i] = other.str[j];
    newStr[length] = '\0';
    return newStr;
}

Скрины с описанием ошибки:

1 2

Answer 1

Вот здесь

String str("HELLO");

"HELLO" приводится к типу const char *. А конструктора такого у вас нет!

Но вот скажите - в конструкторе

String::String(char* str)
{
    length = strlen(str);
    this->str = new char[length + 1];
    for (int i = 0; i < length; i++)
        this->str[i] = str[i];
    this->str[length] = '\0';
}

вы разве меняете строку, на которую указывает аргумент str? Тогда по какой причине вы объявляете его как char* str, а не как const char* str, каковым он и является? объявите его как

String::String(const char* str)

Сразу станет легче жить :) Не экономьте на const!

Вот, например:

size_t String::Length() 
{
    return length;
}

Скажите, эта функция-член меняет объект String? Нет? Так почему вы не объявите ее как константную?

size_t String::Length() const
{
    return length;
}
Answer 2

Строковый литерал "HELLO" в языке C++ имеет тип const char [6]. Он также может быть неявно преобразован к типу const char *.

У вашего класса нет конструкторов, способных принимать аргументы типа const char [6] или const char *. Об этом вам и говорит компилятор.

READ ALSO
Как получить доступ из вложенного объекта к главному

Как получить доступ из вложенного объекта к главному

У меня есть главное окно приложения BankSystem

98
cpp:template - Как решить проблему &quot; cannot convert from &#39;char* const&#39; to int &quot;?

cpp:template - Как решить проблему " cannot convert from 'char* const' to int "?

Разбираюсь с template-ми на c++Написал небольшую функцию которая принимает, какой-то объект MyJSON* _value и в реализации сделал разбор в зависимости...

140
Compile time C++ checksum

Compile time C++ checksum

Есть структура:

222
Проблема с отображением текстур

Проблема с отображением текстур

Здраствуйте, пробую реализовать арканоид, но столкнулся с проблемой, что текстуры привязуется к не правильным участкам пространстваУ меня...

260