Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
1

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

31.07.2012, 18:11. Просмотров 3863. Ответов 3
Метки нет (Все метки)

ребята болит уже голова))
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
в конце там смотрите
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2012, 18:11
Ответы с готовыми решениями:

Перегрузка операторов ввода/вывода
Вроде сделал, но не работает перегрузка оператора ввода. #include &quot;stdafx.h&quot; #include...

Перегрузка операторов ввода\вывода
Вот такой простенький пример описан во многих постах, есть в некоторых видео но у меня в...

Перегрузка операторов ввода-вывода
Доброго времени суток! Почему перестал работать &gt;&gt; оператор для стандартного типа char....

Перегрузка операторов ввода и вывода
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class ComplexNumber { private:...

3
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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, т.е. на внутреннее представление вашей строки в классе.
1
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
01.08.2012, 10:52  [ТС] 3
Спасибо я уже нажал))) не составит труда ещё плис обьяснить зачем const и в чем его фишка???
0
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2012, 18:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Перегрузка операторов ввода и вывода
Добрый вечер! Помогите с задачкой.Я создал класс очередь и класс массив очередей.задача готова, но...

Перегрузка операторов ввода/вывода.
Класс комплексных чисел. Нужно чтобы программа выводила и вводила в таком виде (функции in и out):...

Перегрузка операторов ввода вывода
в .h файле сделал объявление inline ostream&amp; operator &lt;&lt;(ostream&amp;, const Proc&amp;); inline istream&amp;...

Перегрузка операторов потокового ввода-вывода
Пожалуйста, ответе на такой вопрос: почему при написании класса, при перегрузке операторов...


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

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

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