С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/41: Рейтинг темы: голосов - 41, средняя оценка - 4.71
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
1

Разработать класс String для работы со строками

21.06.2019, 15:17. Показов 8091. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу разобраться с проблемой. Вроде все сделал, как надо, а ошибка повторяется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <string>
using namespace std;
/* Разработать класс String_ для работы со строками, в классе должны быть:
0) поле char*, в котором будет храниться нультерминированная строка как динамический массив;
1) конструктор по умолчанию, создающий пустую строку;
2) конструктор, принимающий в качестве параметра нультерминированную строку (const char*);
3) конструктор копирования;
4) конструктор перемещения;
5) деструктор;
6) копирующий оператор присваивания;
7) перемещающий оператор присваивания;
8) оператор + для двух String_, возвращающий новый объект, содержащий результат конкатенации строк.
9) оператор == и != для двух String_ */
 
class String_
{
public:
    char* str[]; //поле char*, в котором будет храниться нультерминированная строка как динамический массив;
 
    String_() //конструктор по умолчанию, создающий пустую строку
    {
        cout << "str" << endl;
        *str = new char[10];
    }
 
    String_(const char*str) //конструктор, принимающий в качестве параметра нультерминированную строку (const char*);
    {
        str = new char[1];
    }
 
    String_(const String_& s) // конструктор копирования;
    {
        cout << "copy" << endl;
        *str = new char[10];
 
        for (int i = 0; i < 10; i++)
        {
            *s.str[i] = *s.str[i];
        }
    }
 
    String_(String_&& s) // конструктор перемещения;
    {
        cout << "перемещение" << endl;
        delete[]str;
        *str = new char[10];
        *str = *s.str;
        *s.str = nullptr;
    }
 
    ~String_()
    {
        cout << "~str~" << endl;
        delete[]str;
    }
 
    String_& operator = (const String_& a) // копирующий оператор присваивания
    {
        cout << "=копирование";
        delete[]str;
        *str = new char[10];
 
        for (int i = 0; i < 10; i++)
        {
            *a.str[i] = *a.str[i];
            return *this;
        }
    }
 
    String_& operator=(String_&& a) // перемещающий оператор присваивания
    {
        if (&a == this)
        {
            return *this;
        }
        delete[]str;
        *str = *a.str;
        *a.str = nullptr;
        return *this;
    }
 
    String_ operator + (String_& s)  //оператор + для двух String_, возвращающий новый объект, содержащий результат конкатенации
    {
        char str1[10] = "wadaw";
        char str2[10] = "cxvcx";
        for (int i = 0; i < 10; i++)
        {
            s.str[i] = str1 + str2[i];
        }
        return *s.str;
    }
    
    String_ operator ==(String_& s) //оператор == и != для двух String_
    {
        char str1[10] = "wadaw";
        char str2[10] = "cxvcx";
        for (int i = 0; i < 10; i++)
        {
            s.str[i] = str1 + str2[i];
        }
        return *s.str;
    }
 
    String_ operator !=(String_& s) //оператор == и != для двух String_
    {
        char str1[10] = "wadaw";
        char str2[10] = "cxvcx";
        for (int i = 0; i < 10; i++)
        {
            s.str[i] = str1 + str2[i];
        }
        return *s.str;
    }
private:
    
};
 
String_ f()
{
    String_ A;
    return A;
}
 
int main()
{
    setlocale(0, "");
 
    String_ a;
    a = a;
}
Миниатюры
Разработать класс String для работы со строками   Разработать класс String для работы со строками  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2019, 15:17
Ответы с готовыми решениями:

Разработать класс String для работы со строками
разработать класс String для работы со строками. Класс должен содержать контср по умолчанию,...

Разработать класс String для работы со строками
/*Разработать класс String для работы со строками. Класс должен содержать: - Конструктор по...

Разработать класс String для работы со строками
Разработать программу, демонстрирующую работу с производным от приведенного в примере класса. Класс...

Разработать класс String, который в дальнейшем будет использоваться для работы со строками
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace std; class string_...

5
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.06.2019, 15:38 2
Лучший ответ Сообщение было отмечено Anonymous4722 как решение

Решение

Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Не могу разобраться с проблемой. Вроде все сделал, как надо, а ошибка повторяется:
C++
1
    char* str; //поле char*, в котором будет храниться нультерминированная строка как динамический массив;
C++
1
2
3
4
5
6
    String_() //конструктор по умолчанию, создающий пустую строку
    {
        cout << "str" << endl;
        str = new char[10];
        str[0] = 0;
    }
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    String_& operator = (const String_& a) // копирующий оператор присваивания
    {
if (&a == this) //Не надо копировать самого себя
    return *this;
 
        cout << "=копирование";
        char *p = new char[10];
 
        for (int i = 0; i < 10; i++)
            p[i] = a.str[i];
 
        delete []str;
        str = p;
        return *this;
 
    }
1
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.06.2019, 16:11 3
Лучший ответ Сообщение было отмечено Anonymous4722 как решение

Решение

Anonymous4722, переделал как можно проще, не тестил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
 
using namespace std;
/* Разработать класс String_ для работы со строками, в классе должны быть:
0) поле char*, в котором будет храниться нультерминированная строка как динамический массив;
1) конструктор по умолчанию, создающий пустую строку;
2) конструктор, принимающий в качестве параметра нультерминированную строку (const char*);
3) конструктор копирования;
4) конструктор перемещения;
5) деструктор;
6) копирующий оператор присваивания;
7) перемещающий оператор присваивания;
8) оператор + для двух String_, возвращающий новый объект, содержащий результат конкатенации строк.
9) оператор == и != для двух String_ */
 
void str_copy(char* dest, const char* source)
{
    for (; *source; *dest++ = *source++);
    *dest = 0;
}
 
size_t str_len(const char* source)
{
    size_t len = 0;
    while (*source++) len++;
    return len;
}
 
class String
{
private:
    size_t size;
    char* str;  //0) поле char*, в котором будет храниться нультерминированная строка как динамический массив;
 
    void swap(String& other)
    {
        std::swap(size, other.size);
        std::swap(str, other.str);
    }
 
    String(size_t sz, char* st) :size(sz), str(st) {}
public:
    //1) конструктор по умолчанию, создающий пустую строку;
    String() : size(0), str(new char[1]) { *str = 0; }
    //2) конструктор, принимающий в качестве параметра нультерминированную строку(const char*);
    String(const char* source) : size(str_len(source)), str(new char[size + 1])
    {
        str_copy(str, source);
    }
    //3) конструктор копирования;
    String(const String& other) :String(other.str) {}
    //4) конструктор перемещения;
    String(String&& other) :String()
    {
        swap(other);
    }
    //5) деструктор;
    ~String()
    {
        delete[] str;
    }
    //6) копирующий оператор присваивания;
    String& operator=(const String& other)
    {
        if (this == &other) return *this;
        return *this = String(other);
    }
    //7) перемещающий оператор присваивания;
    String& operator=(String&& other)
    {
        swap(other);
    }
    //8) оператор + для двух String, возвращающий новый объект, содержащий результат конкатенации строк.
    String operator+(const String& rh) const
    {
        size_t new_size = size + rh.size;
        char* new_str = new char[new_size + 1];
 
        str_copy(new_str, str);
        str_copy(new_str + size, rh.str);
 
        return String(new_size, new_str);
    }
    //9) оператор == и != для двух String
    bool operator==(const String& other) const
    {
        const char* lh = str;
        const char* rh = other.str;
        for (; *lh && *rh; ++lh, ++rh)
        {
            if (*lh != *rh) return false;
        }
        if (*lh || *rh) return false;
        return true;
    }
};
1
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
21.06.2019, 22:22  [ТС] 4
Цитата Сообщение от zayats80888 Посмотреть сообщение
переделал как можно проще, не тестил:
Много ошибок у вас. Не компилируется и выдает ошибки. Нет конструктора. Или может я что-то не понял.
0
1046 / 967 / 153
Регистрация: 10.08.2015
Сообщений: 5,225
21.06.2019, 22:48 5
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Много ошибок у вас.
одна
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Разработать класс String
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.06.2019, 22:50 6
Лучший ответ Сообщение было отмечено Anonymous4722 как решение

Решение

Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Не компилируется и выдает ошибки.
В таком виде и не должен, нужно main() определить.
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Нет конструктора.
Какого?
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Или может я что-то не понял.
Может.
1
21.06.2019, 22:50
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.06.2019, 22:50
Помогаю со студенческими работами здесь

Разработать класс String, который в дальнейшем будет использоваться для работы со строками
Всем доброго времени суток! Вот задание: Разработать класс String, который в дальнейшем...

Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Всем доброго времени суток! Помогите пожалуйста т.к я не очень понимаю задание, что от меня...

Создайте класс String для работы со строками
народ помогите пожалуйста, классы тяжко даются:( 1. код корректен? 2. не могу сообразить как...

Перегрузка операторов. Реализовать класс String для работы со строками символов. Перегрузить операторы «=», «+=»
Реализовать класс String для работы со строками символов. Перегрузить операторы «=», «+=» так,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru