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

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

20.04.2016, 06:05. Показов 9274. Ответов 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
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2016, 00:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nike1995 Посмотреть сообщение
Только можете объяснить почему?
Nike1995, у Вас определён конструктор преобразования к char. Это String(char buf_char); или как-то так. Поэтому, при сложение String +char компилятор вызывает этот конструктор и создаёт экземпляр String. После этого работает operator+(String, String).
Вообще, перегрузка операций и работа со строками это две объемистые задачи. Учить их вперемешку, это как в кузове грузовика на ухабистой дороге учиться акварелью рисовать.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
24.04.2016, 01:34  [ТС]
Хорошо, а можно как-то перегрузить оператор + так, чтобы он конкатинировал char* и char, но без перегрузи конструктора. Как сделать поумнее?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2016, 02:01
Цитата Сообщение от Nike1995 Посмотреть сообщение
но без перегрузи конструктора
Это о чём? Конструктор с одним параметром char уже есть (преобразует char к String). Посмотрите мой пример (повторяю в ...-й раз). Для того, чтобы сложить внешний тип и Ваш класс так чтобы было тип+класс нужен friend operator (бинарный). Это потому, что он вызывается не от экземпляра (экземпляр справа от него). Именно поэтому такой оператор нужно определить глобально, а в классе объявить как friend.
Если бы строки с вами (Вами и вашими однокурсниками) прошли отдельно, а операции разобрали на простых примерах, как модель, то Вы бы усвоили всё вдвое быстрее и без головной боли. Всё это не Ваша вина, а Ваша беда. У меня ощущение, что официальное высшее образование выполняет функции отмазки от армии и занятости (чтобы не шатались где не попадя) давно переросло в уверенность.

Не по теме:

Сегодня по TV (может ложь?) увидел грустную статистику: Россия в год подаёт 400 патентов в патентное ведомство США. Финляндия подаёт 1600. Для сравнения. Мужайтесь. И думайте.

0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
24.04.2016, 05:51  [ТС]
Это при том, что я в топовом Московском ВУЗе на программиста учусь. И благо, что есть курсы, иначе вообще(как большинство моих одногруппников), ничего не понимал бы.

Добавлено через 16 минут
Вот, сделал. Так?
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
#pragma once
 
#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(const String &copy);
    ~String();
 
    String& operator + (const String &right);
    String operator * (const String &right);
    String operator = (const String &right);
    String operator - (const String &right);
 
    String get_lot(String &a, String &b);
    friend String operator +(String &a, char c);
 
    char *get_string();
};
 
#include "classString.h"
 
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';
}
 
char *String::get_string()
{
    return str;
}
 
String String::get_lot(String &a, String &b)
{
    String temp_1,
           temp_2,
           temp_3 = String(a),
           temp_4 = String(b);
 
    temp_1 = temp_3 + temp_4;
    temp_2 = temp_3 * temp_4;
 
    cout << "a * b =" << temp_2.get_string() << endl;
    cout << "a * b =" << temp_1.get_string() << endl;
 
    return temp_2;
}
 
String operator +(String &a, char c)
{
    String t;
    t.str = new char[a.length + 1];
    for(int i = 0; i < a.length; i++)
        t.str[i] = a.str[i];
    t.str[a.length] = c;
    t.str[a.length + 1] = '\0';
    t.length = a.length + 1;
    return t;
}
Добавлено через 3 минуты
По поводу образования, есть несколько очень толковых преподавателей, а главное, заинтересованных- тут грешить нечего. А предметы другого большинства можно и самим осилить, хоть и с головной болью и вдвое дольше
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2016, 10:27
Ваш код написан сложновато для чтения. Порядок объявления не соответствует порядку определения и это ни чем не оправдано. Но вот если попробовать читать:
Вот это что?
Цитата Сообщение от Nike1995 Посмотреть сообщение
C++
1
2
String result;
 delete result.str;
В конструкторе по умолчанию нет выделения памяти, а Вы её удаляете. Это значит - ошибка выполнения. Дальше просто нет настроения и читать. На счёт ВУЗа это не ко мне. Сочувствую.
Работа с памятью, с-строки и перегрузка операций, это в принципе несложные вещи, если учить их стэп-бай-стэп. А в Вашем случае, это стёб-бай-стёб, потому, что всё в куче. Такой подход решает задачу "Чем занять студента".
Самообразование, это единственный путь в нашем случае.
По кодингу Вам тоже много самостоятельно придётся потрудиться. Видно, что Вы хотите знать и готовы работать.
Повторите выделение/освобождение динамической памяти.
Поучите строки отдельно и на простых примерах, чтобы понять основные принципы.
Классы - передача возврат из функции, конструктор копии. И вообще конструкторы.
Потом операции. Тоже всё на предельно простых примерах. Посмотрите мой пример для примера (каламбур). Там класс с одним полем целого типа. Ещё очень полезно вначале снабжать все изучаемые методы (включая конструкторы и деструктор) строчками вроде: cout<<"copy ctor";
0
24.04.2016, 10:33

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Ещё очень полезно вначале снабжать все изучаемые методы (включая конструкторы и деструктор) строчками вроде: cout<<"copy ctor";
а потом всякие там опптимизации/(n)rvo и вызывается что угодно, но не то, на что ты рассчитывал.
хорошо хоть ключи всякие страшные есть -fno-elide-constructors

0
24.04.2016, 10:38

Не по теме:

Цитата Сообщение от Babysitter Посмотреть сообщение
а потом всякие там опптимизации/(n)rvo и вызывается что угодно, но не то, на что ты рассчитывал.
Дык я же про тот случай, когда конструктор, практически, пуст и цель - понять когда он вызывается. То есть о самом начале вхождения в тему. Вон посмотрите что он делает. Разбойник.
О копирующем конструкторе не знает. Память не выделенную удаляет. Небось не знает, что объявление это запуск конструктора. До оптимизаций ещё далеко, если я правильно понимаю. :)

0
24.04.2016, 11:07

Не по теме:

IGPIGP, да знаю я, не удержался просто.
какое-то время на полном серьезе думал, что конструкция навроде

C++
1
std::string x = "hello"
эквивалентна
C++
1
std::string x("hello")
а все потому, что на деле так оно и есть почти всегда.

так что если уж учиться у компилятора, то нужно отрубать все.
шоком было, что -O0 не отрубает rvo например

0
24.04.2016, 12:14

Не по теме:

Babysitter, :D
Теперь понял о чем Вы. Тут пока надо бы с вариантом:

C++
1
MyClass my_first_obj;
разобраться. Мне не приходилось встречать отклонений для простых пользовательских типов. Библиотечные классы тут не нужны. При инициализации должен сразу преобразующий сработать если он есть, а при обычном присваивании, - оператор или конструктор преобразования+конструктор копии. :)

0
24.04.2016, 12:21
0
 Аватар для Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 312
24.04.2016, 12:26
ну если ничего адекватного оператор "-" делать не должен, то можно строку или символ привести к цифровому виду, вычесть другую строку(или символ), тоже в цифровом варианте, потом перевести все назад и посмотреть что получилось
C++
1
2
3
4
5
union str
{
     int a;
     char s[4];
};
в коде выше при изменении массива s[4], меняется и переменная а, и наоборот.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2016, 13:20
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
ну если ничего адекватного оператор "-" делать не должен, то можно строку или символ привести к цифровому виду, вычесть другую строку(или символ), тоже в цифровом варианте, потом перевести все назад и посмотреть что получилось
Зависимость от кодировки это ещё пол беды (или не пол, даже для однобайтовых ), а как их (операнды) к одной длине привести?
Stitch Igorek, сейчас, глядя на код, нужно грубые ошибки, несвязанные с операциями, исправить. А мы вон скоро начнём тонкости explisit объявлений для конструкторов обсуждать.
Правда, Babysitter ?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2016, 13:20
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru