Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
goditsa8
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
#1

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

03.11.2014, 14:24. Просмотров 264. Ответов 4
Метки нет (Все метки)

Всем привет!
Суть: есть класс, есть объект, есть перегруженная операция >> для ввода полей объекта. Есть приватный метод, который вычисляет третье поле по двум введенным. Если объект создавать через конструктор, то все отлично работает. Но если поля вводить через операцию >>, то третье поле никак не хочет вычисляться. Любые манипуляции с объектами, не переданными по ссылке приводят к ошибке сегментирования.
Вот почти рабочий код (комплексное число с полями: вещественная часть, мнимая часть, модуль):
Кликните здесь для просмотра всего текста
header:
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
#ifndef COMPLEX_H_
#define COMPLEX_H_
 
#include <cmath>
#include <iostream>
using std::ostream;
using std::istream;
 
class complex{
private:
    double real;
    double imaginary;
    double r;
 
    void set_r(){ r = sqrt(real*real + imaginary*imaginary); }
public:
    //constructors:
    complex();
    complex(double r, double i);
 
    ~complex();
 
    //math operations:
    complex operator~() const { return complex(real, -imaginary); }
    complex operator+(const complex & cx) const { return complex(real + cx.real, imaginary + cx.imaginary); }
    complex operator-(const complex & cx) const { return complex(real - cx.real, imaginary - cx.imaginary); }
    complex operator*(const complex & cx) const {
        return complex(real * cx.real - imaginary * cx.imaginary, real * cx.imaginary + imaginary * cx.real);
    }
    friend complex operator*(double m, const complex & cx) { return complex(m * cx.real, m * cx.imaginary); }
 
    //io operations:
    void show_r() const;
    friend ostream & operator<<(ostream & os, const complex & cx);
    friend istream & operator>>(istream & is, complex & cx);
};
 
#endif
func
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
#include "complex0.h"
 
// constructors:
complex::complex(){
    real = imaginary = r = 0.0;
}
 
complex::complex(double r, double i){
    real = r;
    imaginary = i;
    set_r();
}
 
complex::~complex(){
}
 
//io operations:
void complex::show_r() const {
    std::cout << r;
}
 
ostream & operator<<(ostream & os, const complex & cx){
    os << "(" << cx.real << ", " << cx.imaginary << "i)";
}
 
istream & operator>>(istream & is, complex & cx){
    using std::cout;
 
    cout << "Вещественная часть: ";
    is >> cx.real;
    cout << "Мнимая часть: ";
    is >> cx.imaginary;
}
main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
#include "complex0.h"
 
int main(){
    complex a(3.0, 4.0);
    complex c;
    cout << "Введите комплексное число (q для выхода):\n";
    while (cin >> c){
        cout << "c = " << c << '\n';                    // значение c
        cout << "модуль c = ";
        c.show_r(); cout << '\n';                       // модуль c
        cout << "сопряженное c = " << ~c << '\n';       // значение сопряженного c
        cout << "a = " << a << '\n';                    // значение a
        cout << "a + c = " << a + c << '\n';            // значение a + c
        cout << "a - c = " << a - c << '\n';            // значение a - c
        cout << "a * c = " << a * c << '\n';            // значение a * c
        cout << "2 * c = " << 2 * c << '\n';            // значение 2 * c
    }
    cout << "Выход!\n";
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2014, 14:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка операции >> (C++):

Перегрузка операции %
Как перегрузить операцию % в с++?

Перегрузка операции
Всем привет! Помогите сделать пожалуйста задание, а то совсем я не понимаю его...

Перегрузка операции >>
Здравствуйте. Возник такой вопрос: возможни ли перегрузить оператор &gt;&gt; так,...

Перегрузка операции
Здравствуйте! Нужно перегрузить операцию &lt;&lt; для вставки полей объекта класса в...

Перегрузка операции ~
Задача: Перегрузить операцию ~ (унарная операция) так, чтобы она изменяла знак...

Перегрузка операции
Здравствуйте, можете пожалуйста помочь с кодом на перегрузку операции: + −...

4
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
03.11.2014, 14:38 #2
Нужно вызывать set_r из оператора >>. Действительная часть, мнимая часть и модуль не являются независимыми, так что не надо хранить все три. Надо бы выбрать какую-то одну форму представления, а другие находить функциями.
1
goditsa8
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
03.11.2014, 18:01  [ТС] #3
Somebody, я бы рад не хранить модуль. Препод придумал, так что других вариантов нет, надо с модулем.

Добавлено через 14 минут
Я не совсем понимать, пусть есть такой код:
C++
1
2
3
4
5
6
7
8
istream & operator>>(istream & is, complex & cx){
    using std::cout;
 
    cout << "Вещественная часть: ";
    is >> cx.real;
    cout << "Мнимая часть: ";
    is >> cx.imaginary;
}
где operator>>() - дружественная функция к классу comlex.
Такой код в теле функции вообще имеет смысл? cx.set_r();, где set_r() - закрытый метод класса.
Компилятор пропускает такой код, вот только при выполнении ошибка сегментирования.
0
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
03.11.2014, 18:28 #4
Лучший ответ Сообщение было отмечено goditsa8 как решение

Решение

Цитата Сообщение от goditsa8 Посмотреть сообщение
Препод придумал, так что других вариантов нет, надо с модулем.
Вместо самогО модуля добавь ф-цию, его возвращающую.

Добавлено через 9 минут
И operator>> должен вернуть istream &
1
goditsa8
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
03.11.2014, 19:22  [ТС] #5
Цитата Сообщение от FIL Посмотреть сообщение
Вместо самогО модуля добавь ф-цию, его возвращающую.
Нельзя так. Нужно именно поле, хранящее модуль.
Цитата Сообщение от FIL Посмотреть сообщение
И operator>> должен вернуть istream &
Да, забыл return is; спасиба.

Добавлено через 6 минут
Дико извиняюсь! Вся проблема была в отсутствии return is;
Теперь cx.set_r() прекрасно работает. Сам дурак.
0
03.11.2014, 19:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2014, 19:22
Привет! Вот еще темы с решениями:

Перегрузка операции +
Всем привет! Ребята, обясните, пжлста, почему конструктор вызывается дважды....

Перегрузка операции
Никак не могу понять как перегрузить оператор. Кучу примеров пересмотрел, но...

Перегрузка операции =
Подскажите пожалуйста как для шаблонной функции перегрузить = есть не сложно то...

Перегрузка операции
Как реализовать код ? &quot;Определить операции над строками :Вставка символа на...


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

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

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