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

Перегрузка операций << и >> - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
kapitan-kuljok
0 / 0 / 0
Регистрация: 01.02.2009
Сообщений: 44
04.03.2012, 16:02     Перегрузка операций << и >> #1
Всем добрый день.. У меня такая проблема, не получается перегрузить операторы << и >> для своего класса, делаю вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CMPLX
{
    public://здесь находятся методы класса (функции)
        CMPLX(); //конструктор класса по умолчанию
        CMPLX (float real, float image); //конструктор класса с входными параметрами
        CMPLX operator--(int number); //декремент модуля
        CMPLX operator+ (CMPLX number); //сложение
        friend ostream &operator << (ostream& , CMPLX &);
        friend istream &operator >> (istream& , CMPLX &);
        void Print(); // печать
        ~CMPLX();
    private: //здесь находятся поля (переменные)
        float re;
        float im;
};
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
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "cmplx.h"
 
 
CMPLX::CMPLX()
{
    re = 0;
    im = 0;
}
 
CMPLX::CMPLX(float real, float image)
{
    re = real;
    im = image;
}
 
 
 CMPLX CMPLX::operator + (CMPLX number)
{
    return CMPLX(re + number.re, im + number.im);
}
 
    
void CMPLX::Print()
{
   std::cout<<re<<"+i"<<im<<endl;
}
 
CMPLX CMPLX::operator -- (int number)
{
    float modul,Sin,Cos;
    modul=sqrt(re*re+im*im);
    Sin=im/modul;
    Cos=re/modul;
    modul--;
    re=modul*Cos;
    im=modul*Sin;
    return CMPLX(re,im);
}
 
 ostream &operator << (ostream& ostr, CMPLX &v)
 {
     ostr<<"Вещественная часть:"<<v.re<<endl;
     ostr<<"Мнимая часть:"<<v.im<<endl;
     return (ostr);
 }
 
 istream &operator >> (istream& ostr , CMPLX &v)
 {
     ostr>>"Вещественная часть:">>v.re;
     ostr>>"Мнимая часть:">>v.im;
     return (ostr);
 }
 
CMPLX::~CMPLX()
{}
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 "stdafx.h"
#include <iostream>
#include <conio.h>
#include "cmplx.h"//здесь находится заголовок  твоего класса
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"rus");
    float re = 0;
    float im = 0;
    cout<<"Введите вещественную часть превого комплексного числа: \n";
    cin>>re;
    cout<<"Введите мнимую часть первого комплексного числа: \n";
    cin>>im;
    if(im>0)
    cout<<"\nПервое число: "<<re<<"+i"<<im<<endl;
    else
        cout<<"\nПервое число: "<<re<<"+i("<<im<<")"<<endl;
    
    CMPLX number1(re,im);  //вызываем конструктор объекта CMPLX и передаем параметры re и im
 
    cout<<"\nВведите вещественную часть второго комплексного числа: \n";
    cin>>re;
    cout<<"Введите мнимую часть второго комплексного числа: \n";
    cin>>im;
    if(im>0)
    cout<<"\nВторое число: "<<re<<"+i"<<im<<endl;
    else
        cout<<"\nВторое число: "<<re<<"+i("<<im<<")"<<endl;
    
    CMPLX number2 (re,im);
    cout<<"\nПроизведем сложение\n"; //произведем сложение
    cout<<"Полученное комплексное число: \n"; //полученное комплексное число
    CMPLX result; //вызываем конструктор по умолчанию.
    result = number1 + number2;//производим сложение комплексных чисел.
    result.Print();
    cout<<"Декремент модуля: \n";
    result--;
    result.Print();
    cout<<result;
 
    //CMPLX a(1, 1);
 
    getch();
    return 0;
    
}
Вот список ошибок, которые выдаёт компилятор:
Код
Ошибка	3	error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	8
Ошибка	5	error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	8
Ошибка	9	error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	9
Ошибка	11	error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	9
Ошибка	12	error C2805: бинарный "operator >>" имеет слишком мало параметров	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	9
Ошибка	6	error C2805: бинарный "operator <<" имеет слишком мало параметров	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	8
Ошибка	13	error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "CMPLX" (или приемлемое преобразование отсутствует)	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\lab5.cpp	45
Ошибка	14	error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" (или приемлемое преобразование отсутствует)	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.cpp	52
Ошибка	15	error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" (или приемлемое преобразование отсутствует)	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.cpp	53
Ошибка	2	error C2433: ostream: "friend" не разрешается для объявлений данных	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	8
Ошибка	8	error C2433: istream: "friend" не разрешается для объявлений данных	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	9
Ошибка	1	error C2143: синтаксическая ошибка: отсутствие ";" перед "&"	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	8
Ошибка	7	error C2143: синтаксическая ошибка: отсутствие ";" перед "&"	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	9
Ошибка	4	error C2061: синтаксическая ошибка: идентификатор "ostream"	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	8
Ошибка	10	error C2061: синтаксическая ошибка: идентификатор "istream"	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.h	9
Работаю в Visual Studio 2010

Помогите пожалуйста!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2012, 16:02     Перегрузка операций << и >>
Посмотрите здесь:

C++ перегрузка операций С++
перегрузка операций C++
C++ перегрузка операций
Перегрузка операций C++
C++ Перегрузка операций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 16:19     Перегрузка операций << и >> #2
похоже все проблемы от этих двух строчек в h файле (это ведь h файл)

C++
1
2
friend ostream &operator << (ostream& , CMPLX &);
friend istream &operator >> (istream& , CMPLX &);
для ostream и istream в этом файле должне быть правильный инклуд: <iosfwd> или <iostream>
+ их имена должны быть полными, т.е. с неймспейсом:
C++
1
2
friend std::ostream &operator << (std::ostream& , const CMPLX &);
friend std::istream &operator >> (std::istream& , CMPLX &);
ну и второй аргумент в операторе вывода должен быть константной ссылкой. он же не изменяется при печате.
kapitan-kuljok
0 / 0 / 0
Регистрация: 01.02.2009
Сообщений: 44
04.03.2012, 16:58  [ТС]     Перегрузка операций << и >> #3
ошибок стало меньше теперь пишет:
Код
Ошибка	2	error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" (или приемлемое преобразование отсутствует)	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.cpp	52
Ошибка	3	error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" (или приемлемое преобразование отсутствует)	c:\documents and settings\jojo\мои документы\учёба\ооп\лабы мои\lab1\lab1\cmplx.cpp	53
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 17:05     Перегрузка операций << и >> #4
C++
1
2
ostr>>"Вещественная часть:">>v.re;
ostr>>"Мнимая часть:">>v.im;
это попытка вызвать std::istream& operator >> (std::istream& in, const char*), а такого оператора нет. если хотите на экран что-то вывести, то сперва нужно вывести строку запроса, а потом уже вводить даные.

C++
1
2
3
4
std::cout<<"Вещественная часть: ";
ostr>>v.re;
std::cout<<"Мнимая часть: ";
ostr>>v.im;
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
04.03.2012, 18:52     Перегрузка операций << и >> #5
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
#include <iostream>
using namespace std;
 
class CMPLX
{
public:
    CMPLX(): re(0.0f), im(0.0f) {}
    CMPLX(float real, float image): re(real), im(image) {}
    friend ostream& operator<<(ostream& os, CMPLX& c);
    friend istream& operator>>(istream& is, CMPLX& c);
private:
    float re;
    float im;
};
 
 ostream& operator<<(ostream& os, CMPLX& c)
 {
    os << "real: " << c.re << "; image: " << c.im;
    return os;
 }
 
 istream &operator>>(istream& is , CMPLX& c)
 {
    cout << "enter real: ";
    is >> c.re;
    cout << "enter image: ";
    is >> c.im;
    return is;
 }
 
int main()
{
    CMPLX c;
    cout << c << endl;
    cin >> c;
    cout << c << endl;
}
kapitan-kuljok
0 / 0 / 0
Регистрация: 01.02.2009
Сообщений: 44
04.03.2012, 19:22  [ТС]     Перегрузка операций << и >> #6
Спасибо всем!! Тема закрыта
Yandex
Объявления
04.03.2012, 19:22     Перегрузка операций << и >>
Ответ Создать тему
Опции темы

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