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] = '';
}
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] = '';
}
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] = '';
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] = '';
return newStr;
}
Скрины с описанием ошибки:
1
2
задан 27 ноя 2019 в 19:38
9
Вот здесь
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] = '';
}
вы разве меняете строку, на которую указывает аргумент 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;
}
ответ дан 27 ноя 2019 в 19:44
HarryHarry
215k15 золотых знаков117 серебряных знаков228 бронзовых знаков
4
Строковый литерал "HELLO"
в языке C++ имеет тип const char [6]
. Он также может быть неявно преобразован к типу const char *
.
У вашего класса нет конструкторов, способных принимать аргументы типа const char [6]
или const char *
. Об этом вам и говорит компилятор.
ответ дан 27 ноя 2019 в 19:45
Из книги: https://www.rulit.me/books/c-b… 8-200.html
Ошибка (активно) E0289 отсутствуют экземпляры конструктора «myclass<Type1, Type2>::myclass [с Type1=char, Type2=char *]», соответствующие списку аргументов
// Здесь используется два обобщенных типа данных в определении класса.
#
C++ | ||
|
You have not defined a constructor for your Movie
class that takes those values as parameters.
If you’re trying to just initialize the object by members, use {}
instead of ()
:
Movie movie1 = Movie{"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};
or just
Movie movie1 = {"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};
Понятия не имею, почему я получаю эту ошибку в этой базовой программе. Я даже проверил код и поискал ответы на этом сайте и в Google. Но я не понимаю, как исправить свою ошибку.
ССЫЛКИ:
E0289: нет экземпляра конструктора «Phone :: Phone» соответствует списку аргументов?
ни один экземпляр конструктора не соответствует списку аргументов
Ошибка: ни один экземпляр конструктора не соответствует списку аргументов
Вот мой код:
#include <iostream>
#include <cmath>
#include <string>
#include <iomanip>
#include "trimdecimal.h"
using namespace std;
class Movie {
public:
string title;
string director;
string mainCast1;
string mainCast2;
int yearReleased;
bool isAHit;
int publicLikePercentage;
};
int main()
{
Movie movie1 = Movie("Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89);
}
И я получаю эту ошибку, как я сказал в заголовке:
E0289 no instance of constructor "Movie::Movie" matches the argument list
Я написал это в Visual Studio 2019
Какие-нибудь решения? Я буду искренне признателен за любые исправления, но, пожалуйста, будьте конкретны и объясните мне, как решить эту проблему, как если бы вы поступили с ребенком.
1 ответ
Лучший ответ
Вы не определили конструктор для вашего класса Movie
, который принимает эти значения в качестве параметров.
Если вы пытаетесь просто инициализировать объект по членам, используйте {}
вместо ()
:
Movie movie1 = Movie{"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};
Или просто
Movie movie1 = {"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};
0
jkb
12 Дек 2019 в 01:04
#include <iostream>
#include <string_view>
#include <string>
std::string_view LoL()
{
std::string str{};
std::getline(std::cin >> std::ws, str);
return str;
}
int main()
{
std::string_view x{LoL};
std::cout << x;
return 0;
}
не компилируется пишет
Ошибка (активно) E0289 отсутствуют экземпляры конструктора «std::basic_string_view<_Elem, _Traits>::basic_string_view [с _Elem=char, _Traits=std::char_traits]», соответствующие списку аргументов getline E:c++getlineSource.cpp 12
что делать
Ответы (2 шт):
В строке
std::string_view x{LoL};
вы передаете в качестве аргумента адрес функции LoL
, а не результат ее вызова.
std::string_view x{LoL()};
Просто интересно, сколько секунд вы пытались решить этот вопрос самостоятельно?
И еще —
std::string_view LoL()
{
static std::string str{};
или
std::string LoL()
{
std::string str{};
std::getline(std::cin >> std::ws, str);
return str;
}
int main()
{
std::string lol = LoL();
std::string_view x{lol};
std::cout << x;
return 0;
}
→ Ссылка