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

Перегрузка операторов ввода вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
maxon887
 Аватар для maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
31.07.2012, 18:11     Перегрузка операторов ввода вывода #1
ребята болит уже голова))
main.cpp
C++
1
2
3
4
5
6
7
8
9
#include "myStr.h"
int main()
{
           myStr myS("ok");
    cout<<myS<<endl;//надо чтоб заработало
    char x;
    cin>>x;
    return 0;
}
myStr.h
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
#ifndef STRING_H
#define STRING_H
 
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
istream& operator>>(istream &i,myStr &s )
{
    const int lim=4096;
    char inBuf[lim];
    i>>setw(lim)>>inBuf;
    s=inBuf;
    return i;
}
ostream&
operator<<( ostream& os,const myStr &s )
{
    return os<<s.c_str();
}
class myStr
{
public:
    //конструкторы
        myStr()
        {
            _size=0;
            str=0;
        }
        myStr(const char *s)
        {
            if(!s)
            {
                _size=0;
                str=0;
            }
            else
            {
            _size=strlen(s);
            str=new char[_size+1];
            strcpy(str,s);
            }
        }
        myStr(const myStr &s)
        {
            if(!s.str)
            {
                _size=0;
                str=0;
            }
            else
            {
            _size=s._size;
            str=new char[_size+1];
            strcpy(str,s.str);
            }
        }
        void show()
        {
            if(!str)
                cout<<"Erro empty string"<<endl;
            else
                cout<<str<<endl;
        }
        //деструктор
        ~myStr()
        {
            delete []str;
        }
        //перегрузка операторов =
        myStr& operator=(const myStr &s)
        {
            delete []str;
            _size=s._size;
            str=new char[_size+1];
            strcpy(str,s.str);
            return *this;
        }
        myStr& operator=(const char *s)
        {
            delete []str;
            _size=strlen(s);
            str=new char[_size+1];
            strcpy(str,s);
            return *this;
        }
        //перегрузка операторов ==
        bool myStr::operator==(const myStr &s)
        {
            if(_size==s._size)
            {
                bool t=true;
                for(int i=0;i<_size;i++)
                {
                    if(str[i]==s.str[i])
                    {}
                    else{
                        t=false;
                        break;
                    }
                }
                return t;
            }
            else 
                return false;
        }
        bool myStr::operator==(const char *s)
        {
            if(_size==strlen(s))
            {
                bool t=true;
                for(int i=0;i<_size;i++)
                {
                    if(str[i]==s[i])
                    {}
                    else{
                        t=false;
                        break;
                    }
                }
                return t;
            }
            else 
                return false;
        }
        //перегрузка []
        char& operator[](int i)
        {
            return str[i];
        }
        //не пойми зачем((( 
        inline char* c_str() { return str; }
    int _size;
    char *str;
};
 
 
#endif
Делаю свой класс строк, хочу сделать вывод в помогите плис
Делал примерно что говорят в книге http://valera.asf.ru/cpp/book/c03.html
в конце там смотрите
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
31.07.2012, 18:40     Перегрузка операторов ввода вывода #2
Определение операторов надо поместить после определения класса, иначе получается неизвестный тип параметров (myStr).

Внутри определения класса для методов не нужно квалифицировать имена с помощью myStr:: Поэтому:
C++
1
bool operator==(const myStr &s)
И ещё нужно добавить const, чтобы не было ругани:

C++
1
inline char* c_str() const { return str; }
Добавлено через 1 минуту
Вообще c_str() будет возвращать указатель на строку char, т.е. на внутреннее представление вашей строки в классе.
maxon887
 Аватар для maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
01.08.2012, 10:52  [ТС]     Перегрузка операторов ввода вывода #3
Спасибо я уже нажал))) не составит труда ещё плис обьяснить зачем const и в чем его фишка???
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
01.08.2012, 18:05     Перегрузка операторов ввода вывода #4
Компилятор позволяет вызывать для константных объектов только константные методы (такие, которые не модифицируют объект).

В перегруженном операторе вывода есть константный объект, вернее константная ссылка на объект(const myStr &s).

C++
1
2
3
4
ostream& operator << ( ostream& os,const myStr &s )
{
    return os<<s.c_str();
}
Для него вызывается метод c_str(). Чтобы подобный вызов был корректным, метод должен быть константным. Поэтому c_str() объявляется с ключевым словом const:

C++
1
inline char* c_str() const
Yandex
Объявления
01.08.2012, 18:05     Перегрузка операторов ввода вывода
Ответ Создать тему
Опции темы

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