#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();
}
C/C++
Лишние проверки у конструкторов с delete[]. Сам вызов конструктора подразумевает что массив пуст.
Лишний подсчет длины (strlen) когда она известна.
Ах да. Изначально было вот что - результат сложения двух обьектов (оператор +) создавал временный обьект. Из за того что = не был перегружен, возникало простое копирование указателя и длины. После копирования временный обьект удаляется. А так как result ссылался на него - то терялись все данные в нем и при вызове деструктора происходила повторная попытка удалить тот же указатель.
C++, свой класс MyClass
Не могу никак понять, что компилятору не нравится, никак не хочет собирать прогу
#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 ссылался на него - то терялись все данные в нем и при вызове деструктора происходила повторная попытка удалить тот же указатель.
в 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();
}
В операторах 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();
}
Юрий Митин
Как запускаю Ваш код, перекидывает на ту же ошибку, если можно это так назвать

Похожие вопросы
- Написать программу на C++.Создать класс vector3d, задаваемый тройкой координат. Создать конструктор...
- Как в C++ продолжить классы разные сгруппировано в файлах .h и .cpp, при этом не переопределяя классы эти?
- Класс Poll и класс Variant (тема инкапсуляция) C++
- Помогите понять отношения между классами / C/C++
- Лёгкое задание с классами C++
- Передача в метод класса указателя на функцию C++
- Получить имена полей класса c++
- Работа с классами в C++
- C++ класс Реализация класс стека,
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?