Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
30.12.2013, 09:25     Перегрузка оператора, для множественного использования #1
Всем доброе утро и с наступающим!
Делаю свой класс строки, и мне захотелось сделать так чтобы ввод в эту строку был подобно выводу 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;
}
Помогите мне найти правильное решение.(Скажите, или укажите на примеры)
Заранее благодарю!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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>>: должна возвращать значение
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 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;
    }
alsav22
5282 / 4801 / 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;
}
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
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);
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.12.2013, 15:15     Перегрузка оператора, для множественного использования #6
Цитата Сообщение от Xipxop Посмотреть сообщение
перегрузка придумана, и по общему решению показалась более логичной, среди всех других.
Смысл перегрузок таких операторов в чём? Есть например класс string. В нем перегружены операторы >>, <<. Чтение в строку: cin >> str, вывод строки: cout << str. Слева поток, справа строка. Создали вы свой класс строк. Хорошей перегрузкой операторов будет такая, которую можно будет использовать в привычном виде: cin >> Mystr, cout << Mystr. Для этого данные перегрузки операторов и применяют: для удобства и привычности использования. Ведь можно было бы просто какие-либо методы своего класса использовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2013, 15:31     Перегрузка оператора, для множественного использования
Еще ссылки по теме:

C++ Перегрузка оператора = для указателей
C++ Перегрузка оператора + для стека
Перегрузка оператора для последовательных действий C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.12.2013, 15:31     Перегрузка оператора, для множественного использования #7
Цитата Сообщение от Xipxop Посмотреть сообщение
Можно ли сделать так, чтобы мой класс перегружал преобразование в char*, без функций?
Можно. Но не стоит.
http://ideone.com/VdhfO5
Yandex
Объявления
30.12.2013, 15:31     Перегрузка оператора, для множественного использования
Ответ Создать тему
Опции темы

Текущее время: 03:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru