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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
#1

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

31.07.2012, 18:11. Просмотров 3289. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2012, 18:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов ввода вывода (C++):

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

Перегрузка операторов ввода/вывода - C++
Вроде сделал, но не работает перегрузка оператора ввода. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; ...

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

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

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

Перегрузка операторов ввода/вывода. - C++
Класс комплексных чисел. Нужно чтобы программа выводила и вводила в таком виде (функции in и out): #include &lt;iostream&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Schizorb
509 / 461 / 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, т.е. на внутреннее представление вашей строки в классе.
1
maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
01.08.2012, 10:52  [ТС] #3
Спасибо я уже нажал))) не составит труда ещё плис обьяснить зачем const и в чем его фишка???
0
Schizorb
509 / 461 / 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
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 18:05
Привет! Вот еще темы с ответами:

Перегрузка операторов ввода\вывода - C++
Вот такой простенький пример описан во многих постах, есть в некоторых видео но у меня в компиляторе mvs 2015, при компиляции выдает...

Перегрузка операторов присваивания, ввода, вывода - C++
Приветствую, помогите реализовать перегрузку операторов(в частности операторы присваивания, ввода, вывода) для данной программы. Я не могу...

Перегрузка операторов потокового ввода вывода - C++
Есть класс &quot;деканат&quot;, полем которого есть список студентов, объектов из класса &quot;Студент&quot;. Как переопределяя операторы &quot;&gt;&gt;&quot; &quot;&quot;&lt;&lt;&quot; вывести...

Перегрузка операторов потокового ввода-вывода - C++
Пожалуйста, ответе на такой вопрос: почему при написании класса, при перегрузке операторов ввода-вывода, их обязательно нужно объявлять в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2012, 18:05
Ответ Создать тему
Опции темы

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