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

Работа с массивом объектов базового и наследующего класса - C++

Восстановить пароль Регистрация
 
BlackDemAn
Сообщений: n/a
15.12.2011, 21:01     Работа с массивом объектов базового и наследующего класса #1
Написал базовый класс Fraction несократимых положительных дробей и наследующий от него класс Rational чисел вида целая часть + дробная часть (здесь используется Fraction).
Реализация классов:
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
#include <iostream>
#include <typeinfo>
 
using namespace std;
 
class Fraction
{
public:     int a,b;
    
            Fraction    () {};
            Fraction    (int aa, int bb) {a=aa;b=bb;reduce();}
            Fraction    (Fraction  & p) {*this = p;}
            
            virtual void reduce();
 
            Fraction operator+ (const Fraction & r);
            Fraction &operator= (const Fraction  & r);
 
            friend istream & operator>> (istream &, Fraction  &); 
            friend ostream & operator<< (ostream &, const Fraction  &);
 
            virtual void show () {cout<<a<<'/'<<b<<endl;} 
};
 
class Rational: public Fraction
{
public:     int n;
    
            Rational () {};
            Rational (int nn, int aa, int bb) : Fraction(aa,bb) {n=nn; reduce();}
            Rational (Rational  & p) {*this = p;}
            Rational (Fraction f) {n=0; a=f.a; b=f.b; reduce();}
 
            void reduce();
 
            Rational operator+ (const Rational & r);
            Rational &operator= (const Rational & r);
 
            friend istream & operator>> (istream &, Rational  &); 
            friend ostream & operator<< (ostream &, const Rational  &);
 
            void show () {cout<<n<<'+'<<a<<'/'<<b<<endl;}
 
};
Функции:
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
#include "header.h"
 
void Fraction::reduce ()    {   
                            int nod, x, y; 
                            x=a; y=b; 
                            while (x!=0 && y!=0) {if(x>=y) x=x%y; else y=y%x;};
                            nod=x+y;
                            a=a/nod;
                            b=b/nod;
                            }
 
Fraction Fraction::operator+ (const Fraction & r)   {
                                                    Fraction n(r.a*b+a*r.b, r.b*b);
                                                    n.reduce();
                                                    return n;
                                                    }
 
Fraction &Fraction::operator= (const Fraction  & r) {
                                                    a=r.a;
                                                    b=r.b;
                                                    return *this;
                                                    }    
 
void Rational::reduce()     {
                            n=n+a/b;
                            a=a%b;
                            int nod, x, y; 
                            x=a; y=b; 
                            while (x!=0 && y!=0) {if(x>=y) x=x%y; else y=y%x;};
                            nod=x+y;
                            a=a/nod;
                            b=b/nod;
                            }
 
Rational Rational::operator+ (const Rational & r)   {
                                                    Rational tmp(n+r.n, a*r.b+r.a*b, b*r.b);
                                                    return tmp;
                                                    }
 
Rational &Rational::operator= (const Rational & r)  {
                                                    n=r.n;
                                                    a=r.a;
                                                    b=r.b;
                                                    return *this;
                                                    }
 
istream & operator>> (istream & in, Fraction  & p)
{
    in >> p.a >> p.b;
    p.reduce();
    return in;
}
ostream & operator<< (ostream & out, const Fraction  & p)
{
    out << p.a << "/" << p.b ;
    return out;
}
 
istream & operator>> (istream & in, Rational  & p)
{
    in >> p.n >> p.a >> p.b;
    p.reduce();
    return in;
}
ostream & operator<< (ostream & out, const Rational  & p)
{
    out << p.n << "+" << p.a << "/" << p.b ;
    return out;
}
По сути задачи мне даётся массив, состоящий из объектов как базового так и наследующего классов. В нём надо посчитать кол-во элементов одного класса, и кол-во элементов другого.
Моя программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "header.h"
 
void main() 
{
Fraction *pF[]={ new Rational(2,4,3), new Fraction(7,8), new Rational(6,7,8), new Fraction(7,5), new Fraction(10,100)};
 
for (int i=0;i<5;i++) (*pF[i]).show();
 
Rational simple_rat(1,1,1);
Fraction simple_frac(1,1);
int kol_rat=0, kol_frac=0;
 
for (int i=0;i<5;i++) if (typeid(*pF[i])==typeid(simple_rat)) kol_rat++; else if (typeid(*pF[i])==typeid(simple_frac)) kol_frac++;
 
cout<<"Rational: "<<kol_rat<<endl<<"Fraction: "<<kol_frac<<endl;
}
Проблема в том что задать массив я могу только приведённым выше способом. Интересует как задавать его с клавиатуры.
Моя идея в том, чтобы сначала просить ввести какого класса будет вводимый объект(к примеру "f" если fraction и "r" если rational), а потом считывать и заносить в массоив. Но никак это реализовать не получается.
P.S. Замечания по остальному коду также приветствуются
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2011, 21:01     Работа с массивом объектов базового и наследующего класса
Посмотрите здесь:

Вызов конструктора базового класса C++
C++ Конструктор базового класса
C++ Функция базового класса
Вызов метода базового класса из класса-потомка C++
C++ Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Вызов конструктора базового класса из класса-наследника C++
Конструктор базового класса C++
C++ Работа с классами: массив объектов класса Complex

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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