Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
1

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

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

Такой вопрос, для строк нужно написать оператор "минус", что это значит? Если оператор "+" конкатенация строк, то что такое оператор "минус"? Можно пример?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2016, 06:05
Ответы с готовыми решениями:

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

Не корректно считает перегрузку оператора "-" после "+"
Доброго дня. Помогите советом. Не корректно считает a - b и a * b , после подсчёта a + b. Понимаю...

Класс "Матрица". Перегрузка оператора "минус"
Помогите дописать программу или исправить ее. Нужно было написать программу, где создать класс...

Написать перегрузку operator+() для класса "Массив"
Добрый день, Подскажите, как выйти правильно из ситуации: Array& Array::operator+(const...

31
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
20.04.2016, 06:28 2
я полагаю
abcdefgh - fgh = abcde
1
Эксперт CЭксперт С++
5072 / 2257 / 331
Регистрация: 20.02.2013
Сообщений: 5,595
Записей в блоге: 19
20.04.2016, 06:28 3
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

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

Мне видятся логичными четыре варианта:
  • удаление из строки всех вхождений заданного символа
  • удаление символа в заданной позиции
  • удаление подстроки из строки
  • удаление всех символов подстроки из заданной строки
А можно и все четыре варианта реализовать.
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
20.04.2016, 08:17  [ТС] 4
Вот, я написал несколько перегруженных операторов:
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
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
20.04.2016, 09:16 5
Nike1995, гляньте
std::basic_string::operator=
0
Комп_Оратор)
Эксперт по математике/физике
8724 / 4455 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
20.04.2016, 10:02 6
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Эксперт С++
5072 / 2257 / 331
Регистрация: 20.02.2013
Сообщений: 5,595
Записей в блоге: 19
20.04.2016, 11:39 7
Цитата Сообщение от 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
Комп_Оратор)
Эксперт по математике/физике
8724 / 4455 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
20.04.2016, 14:13 8
Цитата Сообщение от 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  [ТС] 9
С минусом я разобрался, вопрос был в том почему в операторе = обязательно const в параметрах указывать?
0
Комп_Оратор)
Эксперт по математике/физике
8724 / 4455 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
20.04.2016, 16:26 10
Цитата Сообщение от Nike1995 Посмотреть сообщение
почему в операторе = обязательно const в параметрах указывать
Если функция выводящая на консоль строку, ещё и пишет её в файл, то это побочный эффект. Спросите: - "Вывод на экран или в файл?" и будете иметь ответ "Или то или другое". То есть, если Вы присваиваете объекту другой объект, то не нужно менять объект который присваиваете в операторе присваивания.
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
20.04.2016, 16:40  [ТС] 11
Вот весь код. тут перегружаются операции "+", "-", "=", "*".
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
Комп_Оратор)
Эксперт по математике/физике
8724 / 4455 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
20.04.2016, 17:25 12
Цитата Сообщение от 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  [ТС] 13
Интересно, кто может объяснить, почему после добавления конструктора копирования у меня все заработало. Т.е. до добавления программа работала через раз, а теперь все хорошо. Я только начал С++ изучать, такие моменты хотелось бы понимать. Спасибо))
0
15358 / 8305 / 2015
Регистрация: 30.01.2014
Сообщений: 14,181
20.04.2016, 18:01 14
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

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


А вообще - читай Мейерса и Дьюхэрста, чуть позже Саттера, чтобы научиться применять C++ без ежесекундного отстрела ног.
2
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
21.04.2016, 18:38  [ТС] 15
Теперь другой вопрос. Вот написал я перегрузки операций. Сказали, что нужно сделать так, чтобы они не зависели от типа данных. т.е. я так понимаю, что нужно сделать базовый класс, а от него производный- шаблонный. Только как это делать, я не понимаю, именно как связать шаблонный и базовый классы
0
Комп_Оратор)
Эксперт по математике/физике
8724 / 4455 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
21.04.2016, 22:37 16
Цитата Сообщение от 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Эксперт С++
5072 / 2257 / 331
Регистрация: 20.02.2013
Сообщений: 5,595
Записей в блоге: 19
22.04.2016, 08:29 17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Математика - вещь суть формальная
Да при чём тут математика-то вообще? Математика имеет к программированию весьма косвенное отношение. Никого не парит, что оператор умножения - это ещё и разыменование указателя, знак процента не имеет к процентам никакого отношения, знак ^ не имеет никакого отношения к возведению в степень, а при делении целых чисел, например 1/2 получается ноль. В программировании вся логика контрактная. Вот решили мы, что вот такая-то загогулина будет значить вот то-то и то-то, так и будет. И математика лесом идёт в ту же секунду.
0
Mirmik
22.04.2016, 08:38
  #18

Не по теме:

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

0
Комп_Оратор)
Эксперт по математике/физике
8724 / 4455 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
22.04.2016, 09:43 19
Цитата Сообщение от Mirmik Посмотреть сообщение
Предлагаю использовать оператор минус для выкладывания постов на киберфорум.

gru74ik, я не мог не предполагать бурного сопротивления и предложил:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Предлагаю считать, что вычитание строк как символьных цепочек - дело вкуса. Кому-то нравится, кому-то нет.
и не изменяю своих намерений.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
24.04.2016, 00:14  [ТС] 20
Вот дописал программу. Все работает, только вот что. мне сказали, что нужно перегрузить так, чтобы можно было перегружать операции для 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2016, 00:14

Прегрузка оператора "+" для массива строк
Добрый день, подскажите, как перегрузить оператор сложения двух массивов строк? (A+B) void...

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

Реализовать перегрузку операторов сравнения для пользовательского типа "Обыкновенная дробь"
Структура. дробное сравнение 1. Создайте структуру дробей, состоящую из двух полей int-type ...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru