Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 01.02.2009
Сообщений: 44

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

04.03.2012, 16:02. Показов 4563. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день.. У меня такая проблема, не получается перегрузить операторы << и >> для своего класса, делаю вот так:

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;
    
}
Вот список ошибок, которые выдаёт компилятор:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Ошибка    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

Помогите пожалуйста!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2012, 16:02
Ответы с готовыми решениями:

Перегрузка операций - , -- , -=
Создать класс, который хранит целое девятеричное число без знака. Перегрузить операции -, --, -=. Никак не могу разобрать как переделать...

Перегрузка операций
Всем привет! Помогите пожалуйста с перегрузкой операций. У меня есть вот 4-ая лаба #include &lt;iostream.h&gt; #include...

Перегрузка операций С++
Подскажете пожалуйста, как буквам &quot;А&quot; и &quot;В&quot; присвоить номера 10 и 11 вместо 17 и 18. // пр4.cpp: определяет точку входа для...

5
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 16:19
похоже все проблемы от этих двух строчек в 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 &);
ну и второй аргумент в операторе вывода должен быть константной ссылкой. он же не изменяется при печате.
0
0 / 0 / 0
Регистрация: 01.02.2009
Сообщений: 44
04.03.2012, 16:58  [ТС]
ошибок стало меньше теперь пишет:
Code
1
2
Ошибка    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
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 17:05
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;
1
 Аватар для Konstantin_D
15 / 15 / 6
Регистрация: 21.07.2011
Сообщений: 89
04.03.2012, 18:52
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;
}
0
0 / 0 / 0
Регистрация: 01.02.2009
Сообщений: 44
04.03.2012, 19:22  [ТС]
Спасибо всем!! Тема закрыта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2012, 19:22
Помогаю со студенческими работами здесь

перегрузка операций С++
Доброй ночи. Товарищи помогите пожалуйста, нужно срочно сдать лабораторную, а я никак не освою новый материал, негде даже нормальных...

Перегрузка операций
Подскажите пожалуйста как добавить еще буквы в число , а то должна быть двенадцатиричная система . // ConsoleApplication2.cpp: определяет...

Перегрузка операций + и ++
“Квадратное уравнение ax^2+bx+c”. Обязательно включить метод вычисления корней уравнения. Перегрузить +, ++ вообще без понятия как это...

Перегрузка операций...
Двухмерный массив (матрица) вещественных чисел. Перегрузить () - доступ по индексу. Может кто написать программу... Эту тему не могу...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru