С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
#1

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

30.12.2013, 09:25. Просмотров 320. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2013, 09:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора, для множественного использования (C++):

Перегрузка оператора * и / для строки - C++
Есть класс MyString нужно написать перезагрузку Операция *: должна вернуть новую строку, которая возникнет путем пересечения двух строк,...

Перегрузка оператора == для string - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;stdlib.h&gt; using namespace std; class...

Перегрузка оператора = для указателей - C++
Существует ли возможность предопределить оператор = для такого случая? Object* first = new Object(); Object second = first; //...

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

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

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

6
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.12.2013, 09:31 #2
Ваш код даже не компилируется. Почему ошибки не исправите?
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
Модератор
Эксперт С++
6579 / 6141 / 2023
Регистрация: 18.12.2011
Сообщений: 16,006
Завершенные тесты: 1
30.12.2013, 09:37 #3
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
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.12.2013, 10:03 #4
Цитата Сообщение от 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 / 2
Регистрация: 28.12.2011
Сообщений: 151
30.12.2013, 14:00  [ТС] #5
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
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.12.2013, 15:15 #6
Цитата Сообщение от Xipxop Посмотреть сообщение
перегрузка придумана, и по общему решению показалась более логичной, среди всех других.
Смысл перегрузок таких операторов в чём? Есть например класс string. В нем перегружены операторы >>, <<. Чтение в строку: cin >> str, вывод строки: cout << str. Слева поток, справа строка. Создали вы свой класс строк. Хорошей перегрузкой операторов будет такая, которую можно будет использовать в привычном виде: cin >> Mystr, cout << Mystr. Для этого данные перегрузки операторов и применяют: для удобства и привычности использования. Ведь можно было бы просто какие-либо методы своего класса использовать.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.12.2013, 15:31 #7
Цитата Сообщение от Xipxop Посмотреть сообщение
Можно ли сделать так, чтобы мой класс перегружал преобразование в char*, без функций?
Можно. Но не стоит.
http://ideone.com/VdhfO5
1
30.12.2013, 15:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2013, 15:31
Привет! Вот еще темы с ответами:

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

Использование оператора множественного выбора - C++
Помогите пожалуйста с простой прогой: --&gt; С начала 1990 года по некоторый день прошло n месяцев и 2 дня. определить название месяца...

Перегрузка оператора сравнения для строк - C++
В общем мне нужно сделать такую перегрузку, что бы вместо символа, например, &quot;&lt;&quot; выполнялось сравнение через strcmp, например строка...

Перегрузка оператора для последовательных действий - C++
Можно как нибудь перегрузить оператор, что бы можно было выполнить, например: Matrix a, b, c, d; d = a * b * c; У меня пока...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.