Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
all-ex-g
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 11
1

При раздельной компиляции не работает перегрузка операторов ввода-вывода

22.05.2016, 21:07. Просмотров 162. Ответов 8
Метки нет (Все метки)

разделил программу и при компиляции компилятор ругается на объявление перегрузки операторов ввода вывода(на скриншотах видно что он выводит). сам не могу понять в чем проблема(

https://yadi.sk/i/abSydc0JruPNo
https://yadi.sk/i/j2aVTWBqruPQT
https://yadi.sk/i/L8XS3d4CruPQn


вот основной файл

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <clocale>
#include <cstdlib>
#include "str_type.h"
using namespace std;
 
int main() {
    setlocale(LC_CTYPE, "rus");
    cout << "Вас приветствует программа подсчета погрешности\n\n";
    str_type m_err;
    cin >> m_err;
    
    system("pause");
    return 0;
}
вот заголовочный файл:

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
#ifndef __STR_TYPE_H__
 
#define __STR_TYPE_H__
 
class str_type {
public:
    char *p;
    str_type(char *str = "") {
        p = new char[strlen(str)];
    }
    str_type(size_t str) {
        p = new char[str];
        strcpy(p, "");
    }
    str_type(const str_type &ob);
    ~str_type()
    {
        delete[] p;
    }
    str_type operator+(str_type str);
    str_type operator+(char *str);
    friend str_type operator+(char *str1, str_type str2);
    str_type operator-(str_type str);
    str_type operator-(char *str);
    friend str_type operator-(char *str1, str_type str2);
    str_type operator=(str_type &str);
    str_type operator=(char *str);
};
 
ostream &operator<<(ostream &stream, str_type str);
istream &operator>>(istream &stream, str_type &str);
 
#endif // !__STR_TYPE_H__
вот *.cpp файл(код перегрузки операторов в самом конце):

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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include "str_type.h"
 
str_type::str_type(const str_type &ob) {
    p = new char[strlen(ob.p) + 1];
    strcpy(p, ob.p);
}
 
str_type str_type::operator+(str_type str) {
    str_type temp(strlen(p)+strlen(str.p)+1);
    strcpy(temp.p, p);
    strcat(temp.p, str.p);
    return temp;
}
 
str_type str_type::operator+(char *str) {
    str_type temp(strlen(p) + strlen(str) + 1);
    strcpy(temp.p, p);
    strcat(temp.p, str);
    return temp;
}
 
str_type str_type::operator+(char*str1, str_type str2) {
    str_type temp(strlen(str1) + strlen(str2.p) + 1);
    strcpy(temp.p, str1);
    strcat(temp.p, str2.p);
    return temp;
}
 
str_type str_type::operator-(str_type str) {
    str_type temp(strlen(p));
    char a[2];
    if (strlen(p) >= strlen(str.p))
    {
        for (int i = 0;p[i];i++) {
 
            if (p[i] == str.p[0])
            {
                int count = 0;
                int j, k;
                for (j = i, k = 0; str.p[k];j++, k++) {
                    if (p[j] == str.p[k]) count++;
                }
                if (count == strlen(str.p)) {
                    i += (count - 1);
                }
                else {
                    a[0] = p[i];
                    a[1] = '\0';
                    strcat(temp.p, a);
 
                }
 
            }
            else
            {
                a[0] = p[i];
                a[1] = '\0';
                strcat(temp.p, a);
            }
        }
        return temp;
    }
    else
    {
        cout << "Ошибка! первый аргумент бльше второго! ";
        exit(1);
    }
 
}
 
str_type str_type::operator-(char *str) {
    str_type temp(strlen(p));
    char a[2];
    if (strlen(p) >= strlen(str))
    {
        for (int i = 0;p[i];i++) {
 
            if (p[i] == str[0])
            {
                int count = 0;
                int j, k;
                for (j = i, k = 0; str[k];j++, k++) {
                    if (p[j] == str[k]) count++;
                }
                if (count == strlen(str)) {
                    i += (count - 1);
                }
                else {
                    a[0] = p[i];
                    a[1] = '\0';
                    strcat(temp.p, a);
 
                }
 
            }
            else
            {
                a[0] = p[i];
                a[1] = '\0';
                strcat(temp.p, a);
            }
        }
        return temp;
    }
    else
    {
        cout << "Ошибка! первый аргумент бльше второго! ";
        exit(1);
    }
 
}
 
str_type str_type::operator-(char *str1, str_type str2) {
    str_type temp(strlen(str1));
    char a[2];
    if (strlen(str1) >= strlen(str2.p))
    {
        for (int i = 0;str1[i];i++) {
 
            if (str1[i] == str2.p[0])
            {
                int count = 0;
                int j, k;
                for (j = i, k = 0; str2.p[k];j++, k++) {
                    if (str1[j] == str2.p[k]) count++;
                }
                if (count == strlen(str2.p)) {
                    i += (count - 1);
                }
                else {
                    a[0] = str1[i];
                    a[1] = '\0';
                    strcat(temp.p, a);
 
                }
 
            }
            else
            {
                a[0] = str1[i];
                a[1] = '\0';
                strcat(temp.p, a);
            }
        }
        return temp;
    }
    else
    {
        cout << "Ошибка! первый аргумент бльше второго! ";
        exit(1);
    }
 
}
 
str_type str_type::operator=(str_type &str) {
    if (strlen(str.p) > strlen(p) || strlen(p) > strlen(str.p))
    {
        delete[]p;
        p = new char[strlen(str.p) + 1];
    }
    strcpy(p, str.p);
    return *this;
}
 
str_type str_type::operator=(char *str) {
    if (strlen(str)>strlen(p) || strlen(p)>strlen(str))
    {
        delete[]p;
        p = new char[strlen(str) + 1];
    }
    strcpy(p, str);
    return *this;
}
 
ostream &operator<<(ostream &stream, str_type str) {
    stream << str.p;
    return stream;
}
 
istream &operator>>(istream &stream, str_type &str) {
    stream >> str.p;
    return stream;
}

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

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2016, 21:07
Ответы с готовыми решениями:

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

Перегрузка операторов ввода/вывода.
Класс комплексных чисел. Нужно чтобы программа выводила и вводила в таком виде...

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

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

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

8
hoggy
Заблокирован
Эксперт С++
22.05.2016, 21:17 2
попробуйте сделать так:
в файле str_type.cpp
добавляем информацию об iostream:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// str_type.cpp 
 
#include <iostream>    //<--- в самом начале добавьте эти строки
using std::ostream;
using std::istream;
 
#include "str_type.h"  //<--- теперь внутри заголовочного файла
   //компилятор поймет, чем являются ostream/istream
 
str_type::str_type(const str_type &ob) {
    p = new char[strlen(ob.p) + 1];
    strcpy(p, ob.p);
}
 
...
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
22.05.2016, 21:22 3
либо #include <iostream> в заголовочный файл, либо объявляйте std::istream/std::ostream ручками
0
all-ex-g
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 11
22.05.2016, 21:42  [ТС] 4
hoggy, добавил то что вы посоветовали в файл реализации - выбило те же ошибки(
retmas, добавил то что писали hoggy и вы в заголовочный файл(вместе и по отдельности) и вот что вышло:

https://yadi.sk/i/pKdd7GrpruSRL
0
hoggy
Заблокирован
Эксперт С++
22.05.2016, 21:45 5
Цитата Сообщение от all-ex-g Посмотреть сообщение
добавил то что вы посоветовали в файл реализации - выбило те же ошибки
собирайте проект из студии, а не из командной строки.
покажите выхлоп компилятора от самой студии.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
22.05.2016, 21:51 6
надеюсь переменные среды окружения установлены, раз компилите в командной строке
0
all-ex-g
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 11
22.05.2016, 21:51  [ТС] 7
hoggy, пока еще не умею c проектами в VS работать, но сейчас почитаю про это и попробую. А сама перегрузка правильно оформлена?
0
hoggy
Заблокирован
Эксперт С++
22.05.2016, 22:09 8
Цитата Сообщение от all-ex-g Посмотреть сообщение
А сама перегрузка правильно оформлена?
технически это должно работать.
но на практике, я б такую работу не принял.

вот здесь:
Цитата Сообщение от all-ex-g Посмотреть сообщение
ostream &operator<<(ostream &stream, str_type str);
вы делаете копию объекта.

1.
зачем вы делаете ненужную копию?

2.
где конструктор копирования?
вы нарушили правило 3х.
Распространенные ошибки
0
all-ex-g
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 11
22.05.2016, 23:46  [ТС] 9
retmas, насчет переменных среды, если честно, не имею ни малейшего понятия, а через командную строку компилирую потому что не знаю как работать с проектами в VS( может подскажите что конкретно стоит почитать относительно компилирования в командной строке
hoggy, поменял на ссылку, а конструктор копии был.

решил проблему, перенеся операторные ф-ции в основной файл

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
#include <iostream>
#include <clocale>
#include <cstdlib>
#include "str_type.h"
using namespace std;
 
ostream &operator<<(ostream &stream, str_type &str) {
    stream << str.p;
    return stream;
}
 
istream &operator>>(istream &stream, str_type &str) {
    stream >> str.p;
    return stream;
}
 
int main() {
    setlocale(LC_CTYPE, "rus");
    cout << "Вас приветствует программа подсчета погрешности\n\n";
    str_type m_err;
    cin >> m_err;
    cout << m_err << '\n';
    
    system("pause");
    return 0;
}
если возможно, можете пожалуйста объяснить причину. Ведь гораздо удобней было бы определить операторную ф-цию в файле с телами функций-членов классов.
0
22.05.2016, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2016, 23:46

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

Перегрузка операторов ввода вывода
ребята болит уже голова)) main.cpp #include &quot;myStr.h&quot; int main() { ...

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


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

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

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