С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288

Написать перегрузку оператора "минус" для строк

20.04.2016, 06:05. Показов 9277. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такой вопрос, для строк нужно написать оператор "минус", что это значит? Если оператор "+" конкатенация строк, то что такое оператор "минус"? Можно пример?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.04.2016, 06:05
Ответы с готовыми решениями:

Общие символы для двух строк(своего класса) через перегрузку оператора
Создать свой строковый класс, добавить функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух...

Создать перегрузку оператора == для класса vect
Создать перегрузку оператора == для класса vect , чтобы в функции "Sravn" можно было написать просто if (A == B), вместо A.get_elem(i)...

Как реализовать перегрузку оператора «=» для односвязного списка?
Предыстория: мне нужно реализовать алгоритм быстрой сортировки для односвязного списка. В алгоритме quickSort () на 24 и 25 строках...

31
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
20.04.2016, 06:28
я полагаю
abcdefgh - fgh = abcde
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
20.04.2016, 06:28
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

Nike1995, это т.н. перегрузка операторов. Вы можете написать свой вариант оператора минус, т.е. задать ему произвольное поведение (какое Вам больше нравится).

Мне видятся логичными четыре варианта:
  • удаление из строки всех вхождений заданного символа
  • удаление символа в заданной позиции
  • удаление подстроки из строки
  • удаление всех символов подстроки из заданной строки
А можно и все четыре варианта реализовать.
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
20.04.2016, 08:17  [ТС]
Вот, я написал несколько перегруженных операторов:
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
String String::operator+(String &right)
{
    String temp;
    temp.str = new char[strlen(str) + strlen(right.str)];
 
    temp.str[0] = '\0';
    strcpy(temp.str, str);
    strcat(temp.str, right.str);
 
    temp.length = strlen(temp.str);
 
    return temp;
}
 
String String::operator = (const String &right)
{
    delete []str;
    length = right.length;
    str = new char[length + 1];
    strcpy(str, right.str);
 
    return *this;
}
 
String String::operator * (String &rigght)
{
    String temp;
    char *tmp = NULL;
    bool flag = false;
 
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < rigght.length; j++)
        {
            if(str[i] == rigght.str[j] && !flag)
            {
                flag = true;
                if(temp.str == NULL)
                {
                    temp.length++;
                    temp.str = new char[temp.length+1];
                    temp.str[temp.length - 1] = str[i];
                    temp.str[temp.length] = '\0';
                }
                else
                {
                    tmp = new char[temp.length + 1];
                    strcpy(tmp, temp.str);
                    delete []temp.str;
                    temp.length++;
                    temp.str = new char[temp.length+1];
                    strcpy(temp.str, tmp);
                    temp.str[temp.length-1] = str[i];
                    temp.str[temp.length] = '\0';
                    delete []tmp;
                }
            }
        }
        flag = false;
    }
        return temp;
}
Вопрос по оператору "=". Почему в параметрах обязательно нужно указывать const? без него оператор не работает, а понять почему?- не могу
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
20.04.2016, 09:16
Nike1995, гляньте
std::basic_string::operator=
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.04.2016, 10:02
Nike1995, идея перегрузить операцию вычитания для строк - плоха. Семантически, это будет уродством. Возможно, смысл задания в том, чтобы Вы это поняли. Ну, или это естественный ход мысли для тех, кто Вам задал это задание.
Дело в том, что для строк уже есть перегруженная операция "+". У неё есть такие перегрузки как:
C++
1
2
3
4
5
string operator+(string, string);
string operator+(string, char);
string operator+(char, string);
string operator+(string, char*);
string operator+(char*, string);
квалификаторы const у аргументов опущены для краткости. Моё мнение, - оперерация "-" должна семантически обеспечивать арифметическую логику:
если
c=a+b
то
a=c-b
О том, что c+(-b)=c-b=a я уже молчу. Так как тут неплохо бы перегрузить унарный минус(). Нездоровая идея, я же говорю.
Но если отбросить последнее соображение, то для строк c и b где a=c-b я искал бы в конце строки c подстроку b (возможно односимвольную для перегрузки с символом) и если нашёл, - удалил, а на нет и суда нет.
Реализация несложна, но объёмиста.
Спартанский вариант (который мог бы быть полезен в любом случае) подсчитывать разность длин:
C++
1
int operator-(const string, const string);
и его варианты с си-строками. Причём возвращать именно int а не size_t, так как результат легко может быть отрицательным.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
20.04.2016, 11:39
Цитата Сообщение от IGPIGP Посмотреть сообщение
идея перегрузить операцию вычитания для строк - плоха. Семантически, это будет уродством.
А мне кажется, это просто дело привычки. К сложению строк мы привыкли, а к вычитанию - нет.
По-моему, вполне понятный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// удаление из строки всех вхождений заданного символа:
Stryng sourceStr = "Alastis";
char ch = 's';
Stryng resultStr = sourceStr - ch;
std::cout << resultStr;
 
// удаление символа в заданной позиции:
Stryng sourceStr = "BLACK SABBATH";
int pos = 7;
Stryng resultStr = sourceStr - pos;
std::cout << resultStr;
 
// удаление подстроки из строки:
Stryng sourceStr1 = "METALLICA";
Stryng sourceStr2 = "METAL";
Stryng resultStr = sourceStr1 - sourceStr2;
std::cout << resultStr;
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.04.2016, 14:13
Цитата Сообщение от gru74ik Посмотреть сообщение
А мне кажется, это просто дело привычки. К сложению строк мы привыкли, а к вычитанию - нет.
Математика - вещь суть формальная. Можно привыкнуть к тому что степень 1/2 можно писать:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt[2]{b}, а степень 1/3 , соответственно:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt[3]{b}
А вот писать:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt[\sqrt[2]{x^2+y^2}]{b}
уже не удобно, - не помещается на полке корня ничего существенного. Вот и выходит, что корни 2-й и 3-й степени, это 2 костыля. И детей ставят на них с малолетства.
Имхо, не ко всему нужно привыкать.
C++
1
2
3
4
5
6
7
string bon="Bon";
string jovi="Jovi"
string zashebisya=bon+jovi;//"BonJovi" - зашебись
//а вот с вычитанем к которому "можно привыкнуть"
zashebisya=bon+jovi-jovi;//"Bon"
//поменяем последовательность операций:
zashebisya=bon-jovi+jovi;//"BonJovi" и это не равно bon...
То что криво изначально, никогда нельзя исправить.
Хотя - дело вкуса.
Если начать с того, что операция "+=" - вполне соответствует духу ОП, так как является собственностью экземпляра, а "+" это "дружественная" примочка которую нельзя вызывать от экземпляра потому, что она должна была бы быть методом класса вычислительная цепь (выражение - минимум из 2-х операндов), то можно уйти в дебри.
Предлагаю считать, что вычитание строк как символьных цепочек - дело вкуса. Кому-то нравится, кому-то нет.
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
20.04.2016, 14:35  [ТС]
С минусом я разобрался, вопрос был в том почему в операторе = обязательно const в параметрах указывать?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.04.2016, 16:26
Цитата Сообщение от Nike1995 Посмотреть сообщение
почему в операторе = обязательно const в параметрах указывать
Если функция выводящая на консоль строку, ещё и пишет её в файл, то это побочный эффект. Спросите: - "Вывод на экран или в файл?" и будете иметь ответ "Или то или другое". То есть, если Вы присваиваете объекту другой объект, то не нужно менять объект который присваиваете в операторе присваивания.
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
20.04.2016, 16:40  [ТС]
Вот весь код. тут перегружаются операции "+", "-", "=", "*".
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
using namespace std;
 
class String{
    char *str;
    int length;
public:
    String();
    String(char *buf_str);
    ~String();
 
    String operator + (const String &right);
    String operator * (const String &right);
    String operator = (const String &right);
    String operator - (const String &right);
 
    char *get_string();
    void get_length(char *buf_str);
    void show();
};
 
String String::operator + (const String &right)
{
    String temp;
    temp.str = new char[strlen(str) + strlen(right.str)];
 
    temp.str[0] = '\0';
    strcpy(temp.str, str);
    strcat(temp.str, right.str);
 
    temp.length = strlen(temp.str);
 
    return temp;
}
 
String String::operator = (const String &right)
{
    delete []str;
    length = right.length;
    str = new char[length + 1];
    strcpy(str, right.str);
 
    return *this;
}
 
String String::operator * (const String &rigght)
{
    String temp;
    char *tmp = NULL;
    bool flag = false;
 
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < rigght.length; j++)
        {
            if(str[i] == rigght.str[j] && !flag)
            {
                flag = true;
                if(temp.str == NULL)
                {
                    temp.length++;
                    temp.str = new char[temp.length+1];
                    temp.str[temp.length - 1] = str[i];
                    temp.str[temp.length] = '\0';
                }
                else
                {
                    tmp = new char[temp.length + 1];
                    strcpy(tmp, temp.str);
                    delete []temp.str;
                    temp.length++;
                    temp.str = new char[temp.length+1];
                    strcpy(temp.str, tmp);
                    temp.str[temp.length-1] = str[i];
                    temp.str[temp.length] = '\0';
                    delete []tmp;
                }
            }
        }
        flag = false;
    }
    return temp;
}
 
String String::operator - (const String &rigght)
{
    String temp;
    char *tmp = NULL;
    int count = 0;
 
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < rigght.length; j++)
        {
            if(str[i] != rigght.str[j])
            {
                count++;
                if(count == strlen(rigght.str))
                {
                    if(temp.str == NULL)
                    {
                        temp.length++;
                        temp.str = new char[temp.length+1];
                        temp.str[temp.length - 1] = str[i];
                        temp.str[temp.length] = '\0';
                    }
                    else
                    {
                        tmp = new char[temp.length + 1];
                        strcpy(tmp, temp.str);
                        delete []temp.str;
                        temp.length++;
                        temp.str = new char[temp.length+1];
                        strcpy(temp.str, tmp);
                        temp.str[temp.length-1] = str[i];
                        temp.str[temp.length] = '\0';
                        delete []tmp;
                    }
                }
            }
        }
    }
    return temp;
}
 
String::String()
{
    str = NULL;
    length = 0;
}
 
String::~String()
{
    delete []str;
}
 
String::String(char *buf_str)
{
    get_length(buf_str);
    str = new char[length+1];
    for(int i = 0; i < length; i++)
        str[i] = buf_str[i];
 
    str[length] = '\0';
}
 
void String::get_length(char *buf_str)
{
    int i = 0;
    while(buf_str[i] != '\0')
        i++;
    length = i++;
}
 
void String::show()
{
    cout << str << endl;
}
 
char *String::get_string()
{
    return str;
}
int main()
{
    char str_1[4] = "123";
    char str_2[4] = "173";
    String obj_1(str_1);
    String obj_2(str_2);
    String obj_3;
    String obj_4;
    String obj_5;
    String obj_6;
 
    obj_3 = obj_1 + obj_2;
    obj_4 = obj_1 * obj_2;
    obj_5 = obj_1;
    obj_6 = obj_1 - obj_2;
 
    cout << str_1 << " + " << str_2 << " = " << obj_3.get_string() << endl;
    cout << str_1 << " * " << str_2 << " = " << obj_4.get_string() << endl;
    cout << "obj_5 = obj_1: " << obj_5.get_string() << endl;
    cout << str_1 << " - " << str_2 << " = " << obj_6.get_string() << endl;
 
    return 0;
}
Вот только работает этот код через раз. Что не так в операторах, которые я написал?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.04.2016, 17:25
Цитата Сообщение от Nike1995 Посмотреть сообщение
через раз
Это как? Каковы обстоятельства? Что даёт опрос свидетелей? Показания компилятора особенно важны.
Напишите конструктор копии (я не нашёл).
Операции перегрузите и для сложения с символом char и с c-строкой char*. Причём дружественные варианты (где символ или си-стока - первый операнд) тоже перегрузите.
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
#include <iostream>
using namespace std; 
struct Int
{
int a;
Int():a(0){}//по умолчанию
Int(const int rhs):a(rhs){}//преобразования
Int(const Int &rhs):a(rhs.a){}//копирующий
Int &operator=(Int &rhs)//присваивания
{
a=rhs.a;
return *this; 
}
Int operator+(Int &rhs)
{
int i=rhs.a+a;
return Int(i); 
}
friend Int operator+(const int a, const Int &rhs)
{
return Int(a+rhs.a);
}
};
 
int main()
{
 
Int a(123), b(345);
Int c=a+b;
cout<<c.a<<endl;
c=1+c;
cout<<c.a<<endl;
cin.get();
return 0;    
}
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
20.04.2016, 17:41  [ТС]
Интересно, кто может объяснить, почему после добавления конструктора копирования у меня все заработало. Т.е. до добавления программа работала через раз, а теперь все хорошо. Я только начал С++ изучать, такие моменты хотелось бы понимать. Спасибо))
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.04.2016, 18:01
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

Цитата Сообщение от Nike1995 Посмотреть сообщение
почему после добавления конструктора копирования у меня все заработало
Конструктор копирования вызывается у тебя при возврате значений из функций. (Кстати в операторе присваивания лучше возвращать ссылку).
По умолчанию объект просто копируется почленно. Т.е. в твоем случае без явно определенного конструктора копирования скопируется только адрес (буфера для строки) и длина строки. При этом данные, на которые указывает указатель, скопированы не будут. И при этом же возникнет опасность двойного освобождения памяти, т.к. теперь у нас есть несколько объектов, содержащих адрес одной и той же памяти. Уничтожился один - вызвался деструктор и освободил память. Второй объект после этого уже в невалидном состоянии, т.к. указатель внутри него "протух". Итого получалось, что ты всегда возвращал "протухшие" объекты из своих операторных функций, т.к. локальный объект (внутри функции) освобождал память, которую они с твоей легкой руки делили какое-то время.


А вообще - читай Мейерса и Дьюхэрста, чуть позже Саттера, чтобы научиться применять C++ без ежесекундного отстрела ног.
2
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
21.04.2016, 18:38  [ТС]
Теперь другой вопрос. Вот написал я перегрузки операций. Сказали, что нужно сделать так, чтобы они не зависели от типа данных. т.е. я так понимаю, что нужно сделать базовый класс, а от него производный- шаблонный. Только как это делать, я не понимаю, именно как связать шаблонный и базовый классы
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.04.2016, 22:37
Цитата Сообщение от Nike1995 Посмотреть сообщение
Сказали, что нужно сделать так, чтобы они не зависели от типа данных.
Nike1995, вот это я зачем писал:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Операции перегрузите и для сложения с символом char и с c-строкой char*. Причём дружественные варианты (где символ или си-стока - первый операнд) тоже перегрузите.
??
Посмотрите в том примере, перегрузки сложения Int+int и int+Int. Перегрузки операций сложения char*+string, string+char*, char+string и string+char не должны вызвать трудностей. Операции operator, по сути, это функции и перегружаются они схожим образом.

Добавлено через 2 часа 41 минуту
Nike1995, Вы молчите и значит не понимаете. Или я не понимаю. Вот тут:
Цитата Сообщение от Nike1995 Посмотреть сообщение
я так понимаю, что нужно сделать базовый класс, а от него производный- шаблонный.
Похоже, неверно.
Не зависимость от типа данных у операции сложения означает, что она перегружена для разных типов и в разной последовательности. Тогда с чем бы (из того что вы перегрузили) Вы не складывали Вашу строку операцией '+' она будет складываться. А шаблон и не дал бы ничего путного. Логика сложения строки со строкой и строки с символом разная, что тут шаблон может сделать без кривизны?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.04.2016, 08:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
Математика - вещь суть формальная
Да при чём тут математика-то вообще? Математика имеет к программированию весьма косвенное отношение. Никого не парит, что оператор умножения - это ещё и разыменование указателя, знак процента не имеет к процентам никакого отношения, знак ^ не имеет никакого отношения к возведению в степень, а при делении целых чисел, например 1/2 получается ноль. В программировании вся логика контрактная. Вот решили мы, что вот такая-то загогулина будет значить вот то-то и то-то, так и будет. И математика лесом идёт в ту же секунду.
0
22.04.2016, 08:38

Не по теме:

Предлагаю использовать оператор минус для выкладывания постов на киберфорум.
В задание же небыло, чтобы вычитание делало что-то осмысленное?

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.04.2016, 09:43
Цитата Сообщение от Mirmik Посмотреть сообщение
Предлагаю использовать оператор минус для выкладывания постов на киберфорум.

gru74ik, я не мог не предполагать бурного сопротивления и предложил:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Предлагаю считать, что вычитание строк как символьных цепочек - дело вкуса. Кому-то нравится, кому-то нет.
и не изменяю своих намерений.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
24.04.2016, 00:14  [ТС]
Вот дописал программу. Все работает, только вот что. мне сказали, что нужно перегрузить так, чтобы можно было перегружать операции для char* и char т.е, например, конкатинировать как char* с char*, так и char* с char. Я это сделал так, написал конструктор для char* и для char, правильно ли я сделал?
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
using namespace std;
 
class String{
    char *str;
    int length;
public:
    String();
    String(char *buf_str);
    String(char buf_char);
    String(const String &copy);
    ~String();
 
    String& operator + (const String &right);
    String operator * (const String &right);
    String operator = (const String &right);
    String operator - (const String &right);
 
    char *get_string();
};
 
 
String &String::operator + (const String &right)
{
    String result;
    delete result.str;
    result.length = length + right.length;
    result.str = new char[result.length + 1];
    strcpy(result.str, str);
    strcpy(result.str + length, right.str);
 
    return result;
}
 
String String::operator = (const String &right)
{
    delete []str;
    length = right.length;
    str = new char[length + 1];
    strcpy(str, right.str);
 
    return *this;
}
 
String String::operator * (const String &right_2)
{
    String temp;
    char *tmp = NULL;
 
    temp.str = new char[1];
    temp.str[0] = '\0';
 
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < right_2.length; j++)
        {
            if(str[i] == right_2.str[j])
            {
                tmp = new char[temp.length + 1];
                strcpy(tmp, temp.str);
                delete []temp.str;
                temp.length++;
                temp.str = new char[temp.length+1];
                strcpy(temp.str, tmp);
                temp.str[temp.length-1] = str[i];
                temp.str[temp.length] = '\0';
                delete []tmp;
            }
        }
    }
    cout << temp.get_string() << endl;
    return temp;
}
 
String String::operator - (const String &rigght)
{
    String temp;
    char *tmp = NULL;
    int count = 0;
    temp.str = new char[1];
    temp.str[0] = '\0';
 
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < rigght.length; j++)
        {
            if(str[i] != rigght.str[j])
            {
                count++;
                if(count == strlen(rigght.str))
                {
                    tmp = new char[temp.length + 1];
                    strcpy(tmp, temp.str);
                    delete []temp.str;
                    temp.length++;
                    temp.str = new char[temp.length+1];
                    strcpy(temp.str, tmp);
                    temp.str[temp.length-1] = str[i];
                    temp.str[temp.length] = '\0';
                    delete []tmp;
                }
            }
        }
        count = 0;
    }
 
    return temp;
}
 
String::String()
{
    str = NULL;
    length = 0;
}
 
 String::String(const String &copy)
 {
     length = copy.length;
     str = new char[length+1];
     for(int i = 0; i < length; i++)
        str[i] = copy.str[i];
     str[length] = '\0';
 }
 
String::~String()
{
    delete []str;
}
 
String::String(char *buf_str)
{
    length = strlen(buf_str);
    str = new char[length + 1];
    for(int i = 0; i < length; i++)
        str[i] = buf_str[i];
    str[length] = '\0';
}
 
String::String(char buf_char)
{
    length = 1;
    str = new char[length + 1];
 
    str[0] = buf_char;
    str[length] = '\0';
}
 
char *String::get_string()
{
    return str;
}
 
int main()
{
    String obj[3];
    char str_1 = '1';
    char str_2[4] = "345";
    char str_3[5] = "2389";
    String obj_1, obj_2, obj_3;
    String ob;
 
    obj[1] = String(str_1);
    obj[2] = String(str_2);
    obj[3] = String(str_3);
    obj_1 = obj[1] + obj[2];
    obj_2 = obj[1] * obj[2];
    obj_3 = obj[2] + obj[3];
 
    cout << str_1 << " + " << str_2 << " = " << obj_1.get_string() << endl;
    cout << str_1 << " * " << str_2 << " = " << obj_2.get_string() << endl;
    cout << str_2 << " + " << str_3 << " = " << obj_3.get_string() << endl;
 
    return 0;
}
Добавлено через 10 минут
И какие замечания будут по операторам- это очень важно. Хоть и читаю Шилдта- но опыта еще нет.

Добавлено через 19 минут

Добавлено через 6 минут
на мое удивление возможна конкатенация символа и строки. Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    String obj[2];
    char str_2[4] = "345";
    char str_3[5] = "2389";
    String obj_1, obj_2, obj_3;
    String ob;
 
    obj[1] = String(str_2);
    obj[2] = String(str_3);
    obj_1 = obj[1] + 'a';
    obj_2 = obj[1] * obj[2];
    obj_3 = obj[1] + obj[2];
 
    cout << str_2 << " + " << 'a' << " = " << obj_1.get_string() << endl;
    cout << str_2 << " * " << str_3 << " = " << obj_2.get_string() << endl;
    cout << str_2 << " + " << str_3 << " = " << obj_3.get_string() << endl;
 
    return 0;
}
Только почему перегрузка операторов к примеру конкатенирует char* и char?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2016, 00:14
Помогаю со студенческими работами здесь

Не правильно работает алгоритм вычитания строк при перегрузке оператора "-"(минус)
Написал алгоритм для перегрузки оператора &quot;-&quot; и в принципе все работает корректно, за исключением того, что после присваивания в строках 70...

Для какого оператора можно выполнить перегрузку еще раз
Всем привет. Ребят, подскажите... Сдавал контрольную по классам.. нужно было сделать перегрузку для операторов ++,-- и бинарный +, но...

Организовать перегрузку оператора = и объяснить для чего это сделано
4)Организовать перегрузку оператора = и объяснить для чего это сделано

Перегрузка оператора минус для матриц. Программа зависает в конце своей работы
Написал программу на перегрузку оператора минус для матриц. Например: беру 3 объекта класса matr D=A-B; Всё работает;вычтет из...

Реализовать перегрузку оператора -- для класса "массив вещественных чисел"
Описать класс массив вещественных чисел. Перегрузить операцию:-- удалить элемент из массива по его номеру (индексу).


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru