C/C++

C++, свой класс MyClass

Не могу никак понять, что компилятору не нравится, никак не хочет собирать прогу

 #include  
#include

using namespace std;

class MyClass {
char* mas;
int length;
public:

MyClass(){}

MyClass(const char* mas) {

if (this->mas != nullptr) {
delete[] mas;
}

this->length = strlen(mas);
this->mas = new char[length + 1];

for (int i = 0; i < length; i++) {
this->mas[i] = mas[i];
}

this->mas[length] = '\0';
}

MyClass(const MyClass& other) {

if (this->mas != nullptr) {
delete[] mas;
}

this->length = strlen(other.mas);
this->mas = new char[length + 1];

for (int i = 0; i < length; i++)
{
this->mas[i] = other.mas[i];
}
this->mas[length] = '\0';
}

MyClass operator +(const MyClass& other) {
MyClass object;

if (object.mas != nullptr) {
delete[] mas;
}
int firstLength = strlen(mas);
int secondLength = strlen(other.mas);
object.length = firstLength + secondLength;
object.mas = new char[object.length + 1];

int i = 0;
for (; i < firstLength; i++) {
object.mas[i] = mas[i];
}

for (int j = 0; j < secondLength - 1; j++, i++) {
object.mas[i] = other.mas[j];
}

object.mas[object.length] = '\0';
return object;
}

void Print();

~MyClass() {
delete[] mas;
}
};

void MyClass::Print() {
for (int i = 0; i < length; i++) {
cout mas[i];
}
}


int main() {
MyClass str("Hello, ");
MyClass str2("World!");

MyClass result;
result = str + str2;

result.Print();
}
Юрий Митин
Юрий Митин
39
 #include   
#include

using namespace std;

class MyClass {
char* mas;
int length{};
public:

MyClass() {}

MyClass(const char* mas) {
this->length = strlen(mas);
this->mas = new char[length + 1];

for (int i = 0; i < length; i++) {
this->mas[i] = mas[i];
}

this->mas[length] = '\0';
}

MyClass(const MyClass& other)
{
this->length = other.length;
this->mas = new char[length + 1];

for (int i = 0; i < length; i++)
{
this->mas[i] = other.mas[i];
}
this->mas[length] = '\0';
}

MyClass operator +(const MyClass& other) {
MyClass object;
object.length = this->length + other.length;
object.mas = new char[object.length + 1];

int i = 0;
for (; i < length; i++) {
object.mas[i] = mas[i];
}

for (int j = 0; j < other.length; j++, i++) {
object.mas[i] = other.mas[j];
}

object.mas[object.length] = '\0';
return object;
}

MyClass& operator = (const MyClass& other) //оператор =
{
length = other.length;
delete[] mas;
mas = new char[length + 1];
for (int i = 0; i < length; i++) mas[i] = other.mas[i];
mas[length] = 0;
return *this;
}

void Print();

~MyClass() {
delete[] mas;
}
};

void MyClass::Print() {
for (int i = 0; i < length; i++) {
cout mas[i];
}
}


int main() {
MyClass str("Hello, ");
MyClass str2("World!");

MyClass result;
result = str + str2;

result.Print();
}
Не хватало оператора = (добавил простую версию, без переноса)
Лишние проверки у конструкторов с delete[]. Сам вызов конструктора подразумевает что массив пуст.
Лишний подсчет длины (strlen) когда она известна.
Ах да. Изначально было вот что - результат сложения двух обьектов (оператор +) создавал временный обьект. Из за того что = не был перегружен, возникало простое копирование указателя и длины. После копирования временный обьект удаляется. А так как result ссылался на него - то терялись все данные в нем и при вызове деструктора происходила повторная попытка удалить тот же указатель.
ВН
Виктор Никифоров
51 416
Лучший ответ
в Visual C++ собирается
В данной программе есть несколько ошибок, из-за которых компилятор может не собрать программу.

В операторах delete[] mas; следует использовать this->mas вместо mas.
В операторе цикла в методе operator+ следует заменить secondLength - 1 на secondLength.
В методе operator+ переменные mas и length не определены.
Исправленный код выглядит следующим образом:
#include <iostream>
#include <string>

using namespace std;

class MyClass {
char* mas;
int length;
public:
MyClass() : mas(nullptr), length(0) {}

MyClass(const char* mas) : mas(nullptr), length(0) {
if (this->mas != nullptr) {
delete[] this->mas;
}
this->length = strlen(mas);
this->mas = new char[length + 1];

for (int i = 0; i < length; i++) {
this->mas[i] = mas[i];
}

this->mas[length] = '\0';
}

MyClass(const MyClass& other) : mas(nullptr), length(other.length) {
if (this->mas != nullptr) {
delete[] this->mas;
}

this->mas = new char[length + 1];

for (int i = 0; i < length; i++)
{
this->mas[i] = other.mas[i];
}
this->mas[length] = '\0';
}

MyClass operator +(const MyClass& other) {
MyClass object;

if (object.mas != nullptr) {
delete[] object.mas;
}

int firstLength = strlen(this->mas);
int secondLength = strlen(other.mas);
object.length = firstLength + secondLength;
object.mas = new char[object.length + 1];

int i = 0;
for (; i < firstLength; i++) {
object.mas[i] = this->mas[i];
}

for (int j = 0; j < secondLength; j++, i++) {
object.mas[i] = other.mas[j];
}

object.mas[object.length] = '\0';
return object;
}

void Print();

~MyClass() {
delete[] this->mas;
}
};

void MyClass::Print() {
for (int i = 0; i < length; i++) {
cout << this->mas[i];
}
}


int main() {
MyClass str("Hello, ");
MyClass str2("World!");

MyClass result;
result = str + str2;

result.Print();
}
Юрий Митин Как запускаю Ваш код, перекидывает на ту же ошибку, если можно это так назвать