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
Вот здесь
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;
}
Строковый литерал "HELLO"
в языке C++ имеет тип const char [6]
. Он также может быть неявно преобразован к типу const char *
.
У вашего класса нет конструкторов, способных принимать аргументы типа const char [6]
или const char *
. Об этом вам и говорит компилятор.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть главное окно приложения BankSystem
Разбираюсь с template-ми на c++Написал небольшую функцию которая принимает, какой-то объект MyJSON* _value и в реализации сделал разбор в зависимости...
Здраствуйте, пробую реализовать арканоид, но столкнулся с проблемой, что текстуры привязуется к не правильным участкам пространстваУ меня...