Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Xipxop
481 / 9 / 6
Регистрация: 28.12.2011
Сообщений: 151

Перегрузка оператора, для множественного использования

30.12.2013, 09:25. Показов 1035. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброе утро и с наступающим!
Делаю свой класс строки, и мне захотелось сделать так чтобы ввод в эту строку был подобно выводу cout
например:
C++
1
2
3
int a; char b; char c[];
OPstring str;
str>>"i=">>a>>" a tak kak ">>c>>" olo ">>b;
Так вот, класс я сделал, и перегрузку оператора >> сделал.
Но встряла одна проблема! Он может делать это все только одно действие за раз!
C++
1
str>>a; str>>"=";
исходник:
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
#include <iostream>
#include <string.h>
#include <vector>
 
using namespace std;
 
class OPstring
{
private:
    vector<char>    text;
    char            *pnt_text;
public:
    int             len;
    OPstring(){len=0;}
    OPstring(char *ch)
    {
        for(int i=0;i<strlen(ch);i++)
        {text.push_back(ch[i]);}
        len=text.size();
    }
    char* GetText()
    {
        pnt_text=new char[text.size()];
        copy(text.begin(), text.end(), pnt_text);
        pnt_text[text.size()]='\0';
        return pnt_text;
    }
    OPstring operator>>(int arg)
    {
        text.push_back('A');
    }
    OPstring operator>>(char arg)
    {
        text.push_back('B');
    }
};
 
int main()
{
    OPstring str("Hello word!");
 
 
    str>>1;
    str>>'s';
    cout<<str.GetText();
 
 
    return 0;
}
Помогите мне найти правильное решение.(Скажите, или укажите на примеры)
Заранее благодарю!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.12.2013, 09:25
Ответы с готовыми решениями:

Перегрузка оператора += и = для очереди
Доброе утро! += - сложение очередей, а = присваивание. Просто мне нужно перегрузить -, а получается значит и = тоже. Вот код. Пробую...

Перегрузка оператора >> << для файлов
Здравствуйте. такая вещь, я перегрузил операторы записи и чтения в файл для текстового и двоичного файлов. ifstream&amp;...

Перегрузка оператора для stl
Читаю книгу Аммерааля по stl. разбираю следующий пример. Кто-нибудь может объяснить как работает return в данном примере. Раньше...

6
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.12.2013, 09:31
Ваш код даже не компилируется. Почему ошибки не исправите?
1>d:\my c++projects\lab\main.cpp(1788): error C4716: OPstring::operator>>: должна возвращать значение
1>d:\my c++projects\lab\main.cpp(1792): error C4716: OPstring::operator>>: должна возвращать значение
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
30.12.2013, 09:37
C++
1
2
3
4
5
6
7
8
9
10
   OPstring& operator>>(int arg)
    {
        text.push_back('A');
        return *this;
    }
    OPstring& operator>>(char arg)
    {
        text.push_back('B');
        return *this;
    }
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.12.2013, 10:03
Цитата Сообщение от Xipxop Посмотреть сообщение
и перегрузку оператора >> сделал.
Перегрузка непонятно о чём. Какое отношение ваша перегрузка имеет к классу строка?
Хотя бы, как-то так:
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
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <vector>
 
using namespace std;
 
class OPstring
{
private:
    vector<char>    text;
    char            *pnt_text;
public:
    int             len;
    OPstring(){len=0;}
    OPstring(char *ch)
    {
        for(int i=0;i<strlen(ch);i++)
        {text.push_back(ch[i]);}
        len=text.size();
    }
    char* GetText()
    {
        pnt_text=new char[text.size()];
        copy(text.begin(), text.end(), pnt_text);
        pnt_text[text.size()]='\0';
        return pnt_text;
    }
    
    friend istream& operator>>(istream& in, OPstring& arg)
    {
        arg.text.clear();
        char ch;
        while (in.get(ch) && ch != '\n')
            arg.text.push_back(ch);
        return in;
    }
 
    friend ostream& operator<<(ostream& out, const OPstring& arg)
    {
        for (int i = 0; i < arg.text.size(); ++i)
            out << arg.text[i];
        return out;
    }
 };
 
int main()
{
    OPstring str1("Hello word!");
    OPstring str2("Hello!");
    
    cout << str1 << endl << str2 << endl;
    
    cin >> str1 >> str2;
    
    cout << str1 << endl << str2 << endl;
 
    system("pause");
    return 0;
}
1
 Аватар для Xipxop
481 / 9 / 6
Регистрация: 28.12.2011
Сообщений: 151
30.12.2013, 14:00  [ТС]
alsav22, перегрузка придумана, и по общему решению показалась более логичной, среди всех других.
Спасибо за перегрузку в cout и cin, полезные знания, но я хотел, чтобы моя переменная считалась как родная если её вставить как аргумент который соответствует типу char*.

zss, спасибо, сработало! Но можешь объяснить почему? Зачем нужно было поставить & и возвращать значение(да и еще самого себя)?

alsav22, у меня все норм компилируется, юзаю codeblocks minigw


Можно ли сделать так, чтобы мой класс перегружал преобразование в char*, без функций?
C++
1
2
3
4
5
6
7
8
void funct(char *nomera)
{}
 
int main
{
OPstring str="stroka";
funct(str);
}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.12.2013, 15:15
Цитата Сообщение от Xipxop Посмотреть сообщение
перегрузка придумана, и по общему решению показалась более логичной, среди всех других.
Смысл перегрузок таких операторов в чём? Есть например класс string. В нем перегружены операторы >>, <<. Чтение в строку: cin >> str, вывод строки: cout << str. Слева поток, справа строка. Создали вы свой класс строк. Хорошей перегрузкой операторов будет такая, которую можно будет использовать в привычном виде: cin >> Mystr, cout << Mystr. Для этого данные перегрузки операторов и применяют: для удобства и привычности использования. Ведь можно было бы просто какие-либо методы своего класса использовать.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.12.2013, 15:31
Цитата Сообщение от Xipxop Посмотреть сообщение
Можно ли сделать так, чтобы мой класс перегружал преобразование в char*, без функций?
Можно. Но не стоит.
http://ideone.com/VdhfO5
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.12.2013, 15:31
Помогаю со студенческими работами здесь

Перегрузка оператора + для структуры
У нас есть две строки S1, S2 .После выполнения S3 = S1 + S2 : 1)в S3 должны быть символы входящие в S1 и в S2 одновременно. 2)Посчитать...

Перегрузка оператора << для шаблона
У меня есть структура студенты, а класс-шаблон массив элементов. Как сделать оператор универсальным, подходящим для любых типов(и для...

Перегрузка оператора + для шаблонов
Добрый день Имеется такой класс: #ifndef EXTENDED_H #define EXTENDED_H #include &lt;QString&gt; #include &lt;QDebug&gt;

Перегрузка оператора + для стека
Добрый день. Прошу помощи с перегрузкой этой операции. Цель: перегрузить + так,чтобы он складывал элементы двух стеков в третий.Вроде...

Перегрузка оператора для класса
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ClassA() { m = 1; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru