С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231

Сложение двух string методом перегрузки и помещение в поток

08.01.2017, 14:49. Показов 1402. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственный класс Stroka, представляющий строки символов из таблицы ASCII, с перегруженными операциями конкатенации двух строк и помещения в поток
Задача-то, собственно сделана, но не так, как сказано в условии.

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
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <sstream>
#include <strstream>
#include <string>
#include <algorithm>
using namespace std;
 
 
class stroka
{
    string m_str;
 
public:
 
    stroka(const char* src) : m_str(src) {};
    stroka(const stroka& src) : m_str(src.m_str) {};
 
public:
    const stroka& operator++()
    {
        transform(m_str.begin(),m_str.end(),m_str.begin(),tolower);
        return *this;
    }
 
    const stroka& operator++(int)
    {
        return this->operator++();
    }
 
    friend ostream& operator<<(ostream& out,const stroka& str)
    {
        return out << str.m_str;
    }
//сложение строк без перегрузки + (Работает)
    /*void add(const stroka &second)
    {
        m_str += second.m_str;
    }
*/
    void print()
    {
        cout << m_str;
    }
//(Сложение строк с помощью перегрузки "+", не работает) 
//Вот тут-то меня и настигла неизвестность.
    friend stroka& operator+(const stroka& str1, const stroka& str2) 
    {
        stroka result(stroka& str1);
        result = strcat(str1.m_str, str2.m_str);
        return result;
    }
 
};
int main()
{
    char line[256];
    cout << "Enter line, 255 chars max!" << endl;
    cin.getline(line,255);
    stroka str(line);
    cout << "To lower (operator++) : " << (str++) << endl;
    char line2[256]; 
    cout << "Enter line, 255 chars max!" << endl;
    cin.getline(line2,255); 
    stroka str2(line2);
    str.add(str2); //(Сложение строк без +, работает)
    str= str+str2;//(Сложение строк с помощью перегрузки "+", не работает)
    cout << "str+str2 = ";
    str.print();
    return 0;
}
сделал без потока и конкатенация не работает, можете помочь исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2017, 14:49
Ответы с готовыми решениями:

Функция addarray(): сложение соответствующих элементы двух массивов и помещение результата в третий массив
Напишите функцию с именем addarray(), принимающую два массива в качестве аргументов одинаковой длины. Функция должна складывать...

Сложение двух чисел, имеющих тип string
Итак, нужно сложить два числа, например a+b. Но загвоздка в том, что они должны иметь тип string. Нужно написать такую программу, чтобы она...

Сложение двух чисел, имеющих тип string
Итак, нужно сложить два числа, например a+b. Но загвоздка в том, что они должны иметь тип string. Нужно написать такую программу, чтобы она...

22
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 14:59
strcat используется для конкатенации сишных строк. А для std::string уже есть перегруженный operator+.
Поэтому вместо строк 51-53 достаточно написать:
C++
1
return str1.m_str + str2.m_str;
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 15:07  [ТС]
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <sstream>
#include <strstream>
#include <string>
#include <algorithm>
using namespace std;
 
 
class stroka
{
    string m_str;
 
public:
 
    stroka(const char* src) : m_str(src) {};
    stroka(const stroka& src) : m_str(src.m_str) {};
 
public:
    const stroka& operator++()
    {
        transform(m_str.begin(),m_str.end(),m_str.begin(),tolower);
        return *this;
    }
 
    const stroka& operator++(int)
    {
        return this->operator++();
    }
 
    friend ostream& operator<<(ostream& out,const stroka& str)
    {
        return out << str.m_str;
    }
 
    friend stroka& operator+(const stroka& str1, const stroka& str2) 
    {
         return str1.m_str + str2.m_str;
    }
 
};
int main()
{
    char line[256];
    cin.getline(line,255);
    stroka str(line);
    cin.getline(line2,255); 
    stroka str2(line2);
    str= str+str2;
    str.print();
    return 0;
}

так получается?

Добавлено через 1 минуту
и я правильно в поток поместил?

Добавлено через 14 секунд
и можно ли это сделать более проще?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 15:08
Цитата Сообщение от artem55555p Посмотреть сообщение
так получается?
Да

Добавлено через 1 минуту
Цитата Сообщение от artem55555p Посмотреть сообщение
и я правильно в поток поместил?
Попробуй вывести какую-нибудь строку через cout.
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 15:17  [ТС]
а я правильно в поток поместил?
C++
1
2
3
4
    friend ostream& operator<<(ostream& out,const stroka& str)
    {
        return out << str.m_str;
    }
и можно ли это сделать более проще?

Добавлено через 7 минут
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
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <sstream>
#include <strstream>
#include <string>
#include <algorithm>
using namespace std;
 
 
class stroka
{
    string m_str;
 
public:
 
    stroka(const char* src) : m_str(src) {};
    stroka(const stroka& src) : m_str(src.m_str) {};
 
public:
    const stroka& operator++()
    {
        transform(m_str.begin(), m_str.end(), m_str.begin(), tolower);
        return *this;
    }
 
    const stroka& operator++(int)
    {
        return this->operator++();
    }
 
    friend ostream& operator<<(ostream& out, const stroka& str)
    {
        return out << str.m_str;
    }
 
    friend stroka& operator+(const stroka& str1, const stroka& str2)
    {
        return str1.m_str + str2.m_str;
    }
 
};
int main()
{
    char line[256];
    cin.getline(line, 255);
    stroka str(line);
    char line2[256];
    cin.getline(line2, 255);
    stroka str2(line2);
    str = str + str2;
    str.print();
    return 0;
}
у меня ошибку при компиляции пишет
можете рассказать, что мы тут делаем?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
public:
 
    stroka(const char* src) : m_str(src) {};
    stroka(const stroka& src) : m_str(src.m_str) {};
 
public:
    const stroka& operator++()
    {
        transform(m_str.begin(), m_str.end(), m_str.begin(), tolower);
        return *this;
    }
 
    const stroka& operator++(int)
    {
        return this->operator++();
    }
...
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 15:25
Цитата Сообщение от artem55555p Посмотреть сообщение
у меня ошибку при компиляции пишет
Какую? В какой строке?

Цитата Сообщение от artem55555p Посмотреть сообщение
можете рассказать, что мы тут делаем?
Определяем два конструктора и две функции. Функции осуществляют перегрузку операции ++, первая в префиксной форме, вторая - в постфиксной.
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 15:33  [ТС]
вот
Миниатюры
Сложение двух string методом перегрузки и помещение в поток  
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 15:35  [ТС]
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
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <sstream>
#include <strstream>
#include <string>
#include <algorithm>
using namespace std;
 
 
class stroka
{
    string m_str;
 
public:
 
    //Определяем два конструктора
    stroka(const char* src) : m_str(src) {};
    stroka(const stroka& src) : m_str(src.m_str) {};
 
public:
 
    //перегрузка операции++ в префиксной форме
    const stroka& operator++()
    {
        transform(m_str.begin(), m_str.end(), m_str.begin(), tolower);
        return *this;
    }
    //в постфиксной
    const stroka& operator++(int)
    {
        return this->operator++();
    }
 
    friend ostream& operator<<(ostream& out, const stroka& str)
    {
        return out << str.m_str;
    }
 
    friend stroka& operator+(const stroka& str1, const stroka& str2)
    {
        return str1.m_str + str2.m_str;
    }
 
    void print()
    {
        cout << m_str;
    }
 
};
int main()
{
    char line[256];
    cin.getline(line, 255);
    stroka str(line);
    char line2[256];
    cin.getline(line2, 255);
    stroka str2(line2);
    str = str + str2;
    str.print();
    return 0;
}
2 проблемы решил, щас одна ошибка в 4 строке
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 15:43
C++
1
friend stroka& operator+(const stroka& str1, const stroka& str2)
Здесь нужно возвращать сам объект, а не ссылку. Должно быть так:
C++
1
friend stroka operator+(const stroka& str1, const stroka& str2)
Добавлено через 1 минуту
Цитата Сообщение от artem55555p Посмотреть сообщение
щас одна ошибка в 4 строке
Приведи текст сообщения об ошибке. Только не картинкой, а текстом.
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 15:52  [ТС]
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2440 return: невозможно преобразовать "std::basic_string<char,std::char_traits <char>,std::allocator<char>>" в "stroka" 44


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
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <sstream>
#include <strstream>
#include <string>
#include <algorithm>
using namespace std;
 
 
class stroka
{
    string m_str;
 
public:
 
    //Определяем два конструктора
    stroka(const char* src) : m_str(src) {};
    stroka(const stroka& src) : m_str(src.m_str) {};
 
public:
 
    //перегрузка операции++ в префиксной форме
    const stroka& operator++()
    {
        transform(m_str.begin(), m_str.end(), m_str.begin(), tolower);
        return *this;
    }
    //в постфиксной
    const stroka& operator++(int)
    {
        return this->operator++();
    }
 
    friend ostream& operator<<(ostream& out, const stroka& str)
    {
        return out << str.m_str;
    }
 
    friend stroka operator+(const stroka& str1, const stroka& str2)
    {
        return str1.m_str + str2.m_str;
    }
 
    void print()
    {
        cout << m_str;
    }
 
};
int main()
{
    char line[256];
    cin.getline(line, 255);
    stroka str(line);
    char line2[256];
    cin.getline(line2, 255);
    stroka str2(line2);
    str = str + str2;
    str.print();
    return 0;
}
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 15:55
Вместо 44 строки:
C++
1
2
string s = str1.m_str + str2.m_str;
return stroka(s.c_str());
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 15:57  [ТС]
так, работает, расскажите, что вы сделали)
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 16:02
Цитата Сообщение от artem55555p Посмотреть сообщение
расскажите, что вы сделали
В первой строке создаём временный объект типа string. Во второй строке возвращаем из функции новый объект типа stroka, передавая в конструктор указатель на начало строки (метод c_str()).
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 16:02  [ТС]
по поводу потока, вы писали:
Попробуй вывести какую-нибудь строку через cout.

не знаю как сделать... подскажите
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 16:05
Цитата Сообщение от artem55555p Посмотреть сообщение
не знаю как сделать... подскажите
Почитай сначала про потоки ввода/вывода в С++. Если после этого останутся вопросы - спрашивай.
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 16:21  [ТС]
C++
1
2
3
4
    friend ostream& operator<<(ostream& out, const stroka& str)
    {
        return out << str.m_str;
    }
вот же у меня поток, пытался сделать так:
C++
1
2
3
4
5
6
7
8
int main()
{
    stroka str;
    str << 'sd';
       ....
    system("pause");
    return 0;
}
пишет ошибку...

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
    friend ostream& operator << (ostream& out, const stroka& str)
    {
        return out << str.m_str;
    }
 
 
    friend istream& operator >> (istream& out, stroka& str2)
    {
        return str2 >> out;
    }
так ввод и вывод будет?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 16:22
Строку нужно вывести через поток cout:
C++
1
2
stroka str("privet");
std::cout << str;
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 16:28  [ТС]
и помещения в поток

я так понимаю ввод и вывод делать через поток, разве нет?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 16:39
Цитата Сообщение от artem55555p Посмотреть сообщение
я так понимаю ввод и вывод делать через поток
Да.
0
29 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 231
08.01.2017, 16:46  [ТС]
Вопрос, как это сделать, http://mycpp.ru/cpp/book/c15.html тут читал пример тоже, про перегрузку конкатенации, но я не разобрался...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2017, 16:46
Помогаю со студенческими работами здесь

Класс Комплексные числа. Извлечение и помещение в поток
Дано такое задание Создать класс представляющий понятие комплексных чисел с переопределёнными операциями сложения,вычитания,помещения в...

Выполнить объединение двух строк с помощью перегрузки оператора (*)
#define _CRT_SECURE_NO_WARNINGS #include&lt;iostream&gt; #include&lt;string&gt; using namespace std; class String { char *str; int...

Конкатенация двух нибблов (сложение двух полубайт в байт)
Как из этих двух полубайт получить полноценный байт со значение &quot;0x3e&quot;? unsigned char first_nibbl = 0x03 unsigned char last_nibbl =...

Как можно обрабатывать разные типы одним и тем же методом кроме перегрузки
Здраствуйте, интересует такой вопрос. Есть классы A,B,C. Класс С принимает внутри себя классы A и B методом GetClass class a ...

Open Watcom нет перегрузки для оператора ввода для типа std::string
Решил использовать компилятор Open Watcom C++ и в результате не компилируется проект. Проект прилагается


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

Или воспользуйтесь поиском по форуму:
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