0 / 0 / 0
Регистрация: 27.05.2017
Сообщений: 5
1

Перегрузка оператора >> для дочернего класса от базового виртуального класса

27.05.2017, 10:45. Показов 5088. Ответов 6

Доброго вам времени суток!
Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников, обращаюсь за помощью сюда.
Суть такова: есть базовый виртуальный класс Series, содержащий две виртуальные функции вычисления элемента прогрессии и суммы прогрессии. Один производный класс считает для арифметической, другой для геометрической прогрессии значения.
Проблема: при перегрузки оператора >>, который должен записывать вводимые значения с клавиатуры в дочерние классы через переменные, объявленные в базовом классе, проблема с правым операндом. Т.к я плохо представляю как это должно правильно выглядеть, то прошу помощи в реализации перегрузки оператора >> в данной задаче.


C++
1
2
3
4
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
Базовый класс Series, содержащий виртуальные функции :
virtual double element() = 0;
virtual double summ() = 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
class Series
{
protected:
    double first, difference, number;
public:
    Series() {
        first = difference = number = 0.0;
    }
    Series(double first, double difference, double number)
    {
        this->first = first;
        this->difference = difference;
        this->number = number;
    }
 
    double get_first()
    {
        return first;
    }
    double get_difference()
    {
        return difference;
    }
    double get_number()
    {
        return number;
    }
    virtual double element() = 0;
    virtual double summ() = 0;
};
Дочерний класс Linear и Exponential
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
class Linear : public Series
{
    double an;
public:
 
    Linear() { an = 0.0; }
 
    Linear(double first, double difference, double number) :Series(first, difference, number) {}
 
    virtual double element()
    {
        an = (get_first() + get_difference()*(get_number() - 1));
        return an;
    }
    virtual double summ()
    {
        return ((get_first() + an)*get_number()/2);
    }
    istream& operator >> (Linear& V1)
    {
        cin >> V1.first;
        cin >> V1.difference;
        cin >> V1.number;
    }
    ~Linear() {}
};
 
class Exponential : public Series
{
    double an;
public:
 
    Exponential() { an = 0.0; }
 
    Exponential(double first, double difference, double number) :Series(first, difference, number) {}
 
    virtual double element()
    {
        
        an = (get_first()*pow(get_difference(), (get_number() - 1)));
        return an;
    }
    virtual double summ()
    {
        return ((get_first()-an*get_difference())/(1-get_difference()));
    }
    ~Exponential() {}
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    double first, difference, number;
    Series *point;
    Linear V1;
    cin >> V1;
    point = &Linear();
    cout << point->element() << endl;
    cout << point->summ() << endl;
    point = &Exponential(first, difference, number); // исходный старый кусок кода, в котором на прямую
                                                     // вводились значения в main через cin с клавы в first, difference, number;
    cout << point->element() << endl;
    cout << point->summ() << endl;
    system("pause");
    return 0;
}
Буду рад критике и советам насчёт моего кода.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2017, 10:45
Ответы с готовыми решениями:

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса...

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе,...

Список дочернего класса привести к списку базового класса
Детский вопрос, но все же. есть классы: class Base { public string str = &quot;base&quot;; ...

Вызов виртуального метода базового класса из указателя производного
Допустим есть такой код: #include &lt;iostream&gt; class Base { public: virtual void f() {...

6
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
27.05.2017, 11:26 2
Цитата Сообщение от LiapkinTiapkin Посмотреть сообщение
базовый виртуальный класс Series
Абстрактный класс, а не виртуальный.

Добавлено через 10 минут
LiapkinTiapkin,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
    friend A&operator >> (istream&input, A&obj);
    friend A&operator << (ostream&input, A&obj);
public:
    int a;
    virtual void f() = 0;
 
};
A&operator >> (istream&input, A&obj)
{
    input >> obj.a;
    return obj;
}
A&operator << (ostream&output, A&obj)
{
    output << obj.a;
    return obj;
}
0
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
27.05.2017, 11:44 3
MisterR, разве не istream& operator... и ostream& operator... должны возвращать?

Добавлено через 5 минут
Да и смысла наверно создавать перегрузку в Абстрактном классе нет, т.к. объект создать не получится (искл. указатель на него). Она (перегрузка) все равно же не наследуется.
0
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
27.05.2017, 11:52 4
Цитата Сообщение от anapshy Посмотреть сообщение
разве не istream& operator... и ostream& operator... должны возвращать?
Согласен(напортачил). << или >> будет доступно только раз.
0
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
27.05.2017, 12:13 5
LiapkinTiapkin,
C++
1
2
Linear() : Series() { an = 0.0; } // 6 строка
Exponential() : Series() { an = 0.0; } // 33 строка
Добавлено через 6 минут
Перегрузки вводы делаются примерно так:
C++
1
2
3
4
5
friend istream& operator>>(istream &is, YourObject &obj) {
  is >> obj.a >> obj.b >> obj.c; // и т.д.
  is >> obj.d;
  return is;
}
Добавлено через 2 минуты
C++
1
2
point = &Exponential(first, difference, number); // исходный старый кусок кода, в котором на прямую
                                                     // вводились значения в main через cin с клавы в first, difference, number;
Всё верно.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
#include <stdio.h>
#include <math.h>
/* Не ошибка, но используй аналоги С++ */
#include <cstdio>
#include <cmath>
#include <cstdlib> // == <stdlib.h>  для system(...);
Не обязательно использовать функции. Переменные наследуются же:
C++
1
2
3
4
5
6
7
8
9
10
11
12
/* До: */
virtual double element()
    {
        an = (get_first() + get_difference()*(get_number() - 1));
        return an;
    }
/* После: */
virtual double element()
    {
        an = first + difference*(number - 1);
        return an;
    }
0
0 / 0 / 0
Регистрация: 27.05.2017
Сообщений: 5
27.05.2017, 14:29  [ТС] 6
Спасибо, с этим разобрался!

В итоге почему то введёные значения не доходят до базового класса.. Найдите пожалуйста ошибку, спасибо вам (:

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
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
 
 
class Series
{
protected:
    double first, difference, number;
public:
    Series() {
        first = difference = number = 0.0;
    }
    Series(double first, double difference, double number)
    {
        this->first = first;
        this->difference = difference;
        this->number = number;
    }
 
    double get_first()
    {
        return first;
    }
    double get_difference()
    {
        return difference;
    }
    double get_number()
    {
        return number;
    }
    virtual double element() = 0;
    virtual double summ() = 0;
};
 
class Linear : public Series
{
protected:
    double an;
public:
 
    Linear() : Series() { an = 0.0; }
 
 
    Linear(double first, double difference, double number) :Series(first, difference, number) {}
 
    virtual double element()
    {
        cout << first;
        an = first + difference*(number - 1);
        return an;
    }
    virtual double summ()
    {
        return ((get_first() + an)*get_number()/2);
    }
    friend istream& operator >> (istream &is, Linear& V1)
    {
        cout << "1) Take in First Element of progresion" << endl;
        cin >> V1.first;
        cout << "2) Take in difference of progresion" << endl;
        cin >> V1.difference;
        cout << "3) Take in last element of progresion" << endl;
        cin >> V1.number;
        return is;
    }
    ~Linear() {}
};
 
class Exponential : public Series
{
protected:
    double an;
public:
 
    Exponential() : Series() { an = 0.0; }
 
    Exponential(double first, double difference, double number) :Series(first, difference, number) {}
 
    virtual double element()
    {
        
        an = (get_first()*pow(get_difference(), (get_number() - 1)));
        return an;
    }
    virtual double summ()
    {
        return ((get_first()-an*get_difference())/(1-get_difference()));
    }
    friend istream& operator >> (istream &is, Exponential& V2)
    {
        cout << "1) Take in First Element of progresion" << endl;
        cin >> V2.first;
        cout << "2) Take in difference of progresion" << endl;
        cin >> V2.difference;
        cout << "3) Take in last element of progresion" << endl;
        cin >> V2.number;
        return is;
    }
    ~Exponential() {}
};
 
void menu()
{
    cout << "1) Take in First Element of progresion" << endl;
    cout << "2) Take in difference of progresion" << endl; 
    cout << "3) Take in last element of progresion" << endl; 
}
 
 
int main()
{
    
    Series *point;
    Linear V1;
    Exponential V2;
 
    cin >> V1;
    point = &Linear();
    cout << point->element() << endl;
    cout << point->summ() << endl;
    cin >> V2;
    point = &Exponential(); // исходный старый кусок кода, в котором на прямую                                    // вводились значения в main через cin с клавы в first, difference, number;
    cout << point->element() << endl;
    cout << point->summ() << endl;
    system("pause");
    return 0;
}
0
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
27.05.2017, 17:47 7
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
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
class Series
{
protected:
    double first, difference, number;
public:
    Series(void) { first = difference = number = 0.0; };
    Series(double first, double difference, double number) {
        this->first = first;
        this->difference = difference;
        this->number = number;
    };
    double get_first(void) { return first; }
    double get_difference(void) { return difference; }
    double get_number(void) { return number; }
    virtual double element(void) = 0;
    virtual double summ(void) = 0;
};
 
class Linear : public Series
{
protected:
    double an;
public:
    Linear(void) : Series() { an = 0.0; };
    Linear(double first, double difference, double number) : Series(first, difference, number) {};
    virtual double element(void) {
        cout << first;
        an = first + difference*(number - 1);
        return an;
    }
    virtual double summ(void) { return ((first + an)*number / 2); }
    friend istream& operator >> (istream &is, Linear& V1)
    {
        cout << "1) Take in First Element of progresion: "; is >> V1.first;
        cout << "2) Take in difference of progresion: ";    is >> V1.difference;
        cout << "3) Take in last element of progresion: ";  is >> V1.number;
        return is;
    }
    ~Linear(void) {};
};
 
class Exponential : public Series
{
protected:
    double an;
public:
    Exponential(void) : Series() { an = 0.0; };
    Exponential(double first, double difference, double number) : Series(first, difference, number) {};
    virtual double element(void) {
        an = first*pow(difference, number - 1);
        return an;
    }
    virtual double summ(void) { return (first - an*difference) / (1 - difference); }
    friend istream& operator >> (istream &is, Exponential& V2)
    {
        cout << "1) Take in First Element of progresion: "; is >> V2.first;
        cout << "2) Take in difference of progresion: ";    is >> V2.difference;
        cout << "3) Take in last element of progresion: ";  is >> V2.number;
        return is;
    }
    ~Exponential(void) {};
};
 
void menu(void)
{
    cout << "1) Take in First Element of progresion" << endl;
    cout << "2) Take in difference of progresion" << endl;
    cout << "3) Take in last element of progresion" << endl;
}
 
 
int main(void)
{
    Series *point;
    Linear V1;
    Exponential V2;
 
    cin >> V1;
    point = &V1;
    cout << point->element() << endl;
    cout << point->summ() << endl;
 
    cin >> V2;
    point = &V2;
    cout << point->element() << endl;
    cout << point->summ() << endl;
 
    system("pause");
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2017, 17:47
Помогаю со студенческими работами здесь

Вызов метода дочернего класса из базового
Привет всем. Ни как не могу понять как позволить базовому классу вызвать метод дочернего. Например:...

Перегрузка оператора для класса
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ...

Вызов базового конструктора с параметрами из дочернего класса
Всем привет. Есть базовый класс, у которого есть конструктор с параметром. Создал дочерний класс...

Перегрузка оператора + для класса String
Подскажите, как реализовать перегрузку оператора сложения для класса String Вот, что пока...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru