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

Вызов методов производного класса - C++

Восстановить пароль Регистрация
 
Федорец
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 65
30.03.2014, 13:23     Вызов методов производного класса #1
Возникла проблема с выполнением задачи. программа запускается, работает, но почему-то не выводит метод scan и print наследовательного класса, только класс person

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
#include <iostream>
#include <string>
#include <conio.h>
#include <locale>
using namespace std;
 
class person{
    string name;
    int year;
    char pol;
    
    public:
        person() { name=""; year=0; pol=' ';}
        person(string,char);
        int GetYear(){return year;}
        string GetName() { return name;}
        char GetPol() {return pol;}
        void SetName (string Name) {name=Name;}
        void SetYear(int Year){year=Year;}              
        void SetPol(char Pol) {pol=Pol;}
        void scan() { cout<<"Ââåäèòå ÔÈÎ: \n"; getline(cin,name); getline (cin,name); cout<<"Ââåäèòå ãîä ðîæäåГ*ГЁГї:\n"; 
        cin>>year; cout<<"Ââåäèòå ïîë:\n"; cin>>pol;}
        void print() { cout<<"ÔÈÎ: "<<name<<endl<<"Ãîä ðîæäåГ*ГЁГї: "<<year<<endl<<"Ïîë:"<<pol<<endl;}
        };
        
        class client_library:public person{//Г*Г*ñëåäîâГ*òåëüГ*ВіГ© ГЄГ«Г*Г±Г± îò person
            int number_b;//Г*îìåð áèëåòГ*
            int vnesok; 
            string deta;//Г¤Г*ГІГ* ïîëó÷åГ*ГЁГї áèëåòГ*
            string books;
 
            public:
                
                int getnumber_b() {return number_b;}
                string getdeta() {return deta;}
                int getvnesok() {return vnesok;}
                string getbooks () {return books;}
                
                void setnumber_b(int nBil) {number_b=nBil;}
                void setdeta (string d) {deta=d;}
                void setvnesok (int Vn) {vnesok=Vn;}
                void setbooks (string bk) {books=bk;}
                
                void Zn ();
                void scan();
                void print();
            };
                 
            
                 void client_library::scan()
                    { 
                     int n=0;
                     person::scan();
                      cout<<"Ââåäèòå Г*îìåð áèëåòГ*: "; 
                      cin>>number_b; 
                      cout<<"\nÂâåäèòå Г¤Г*ГІГі âûäГ*Г·ГЁ: "; 
                      getline(cin,deta);
                        cout<<"\nÂâåäèòå ñóììó åæåìåñÿ÷Г*îãî ГўГ§Г*îñГ* Гў êëóá: "; 
                        cin>>vnesok; 
                        cout<<"\nÂâåäèòå êîëè÷åñòâî ГЄГ*ГЁГЈ: "; 
                        cin>>n; 
                        cout<<"\nÂâåäèòå Г*Г*çâГ*Г*ГЁГї ГЄГ*ГЁГЈ: ";
                        for(int i=0;i<n;i++) 
                         { 
                             getline(cin,books);
                         } 
                    }
                                
                void client_library::print()
                {
                    person::print();
                    cout<<"Íîìåð áèëåòГ*: "<<number_b<<endl<<"Г„Г*ГІГ* âûäГ*Г·ГЁ: "<<deta<<endl;
                    cout<<"ÅæåãîäГ*ûé ГўГ§Г*îñ: "<<vnesok*12<<endl;
                    cout<<"ГЉГ*ГЁГЈГЁ: \n"<<books;
                }
        
        
        int main()
        {   
            int n;
            setlocale(LC_ALL,"Russian");
            cout<<"Vvedite k-vo person: ";
            cin>>n;
            cout<<endl;
            client_library *a=new client_library [n];
            for (int i=0; i<n; i++)
            {
            a[i].scan();
            a[i].print();
            }
            return 0;
        getch();
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
30.03.2014, 13:45     Вызов методов производного класса #2
Все у Вас вызывается правильно.
Может быть забыли, что у Вас внутри функций производного класса
стоит вызов соответствующих функций базового класса, например в client_library::scan()
C++
1
person::scan();
Обратите внимание на ошибки ввода такого типа
C++
1
2
3
4
cout<<"Введите номер билета: "; 
                      cin>>number_b; 
                      cout<<"\nВведите дату выдачи: "; 
                      getline(cin,deta);
После ввода number_b указатель потока стоит на символе "конец строки".
getline(cin,deta) - прочитает этот символ как целую строку.
Проще всего в этих местах дублировать чтение.
C++
1
2
 getline(cin,deta);
 getline(cin,deta);
Федорец
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 65
30.03.2014, 14:38  [ТС]     Вызов методов производного класса #3
Заработало, все отлично.Спасибо. Не могу теперь понять, почему в функции print не выводится список книг?

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
#include <iostream>
#include <string>
#include <conio.h>
#include <locale>
using namespace std;
 
class person{
    string name;
    int year;
    char pol;
    
    public:
        person() { name=""; year=0; pol=' ';}
        person(string,char);
        int GetYear(){return year;}
        string GetName() { return name;}
        char GetPol() {return pol;}
        void SetName (string Name) {name=Name;}
        void SetYear(int Year){year=Year;}              
        void SetPol(char Pol) {pol=Pol;}
        void scan() { cout<<"Введите ФИО: \n"; getline(cin,name); getline (cin,name); cout<<"Введите год рождения:\n"; 
        cin>>year; cout<<"Введите пол:\n"; cin>>pol;}
        void print() { cout<<"ФИО: "<<name<<endl<<"Год рождения: "<<year<<endl<<"Пол:"<<pol<<endl;}
        };
        
        class client_library:public person{//наследовательній класс от person
            int number_b;//номер билета
            int vnesok; 
            string deta;//дата получения билета
            string books;
            int k_b;//количество книг
            
 
            public:
                
                
                int getnumber_b() {return number_b;}
                string getdeta() {return deta;}
                int getvnesok() {return vnesok;}
                string getbooks () {return books ;}
                
                void setnumber_b(int nBil) {number_b=nBil;}
                void setdeta (string d) {deta=d;}
                void setvnesok (int Vn) {vnesok=Vn;}
                void setbooks (string bk) {books=bk;}
                
                void Zn ();
                void scan();
                void print();
            };
                 
                 void client_library::Zn()
                 {  
                    int Zn=0;
                    if(k_b<=5)
                    Zn=5;
                    if (k_b>5&&k_b<20)
                    Zn=10;
                    if (k_b>=20)
                    Zn=15;
                    cout<<"\nСкидка: "<<Zn<<"%\n\n";
                 }
                 
                 void client_library::scan()
                    { 
                     
                      person::scan();
                      cout<<"Введите номер билета: "; 
                      cin>>number_b; 
                      cout<<"Введите дату выдачи: "; 
                      getline(cin,deta);
                      getline (cin,deta);
                        cout<<"Введите сумму ежемесячного взноса в клуб: "; 
                        cin>>vnesok; 
                        cout<<"Введите количество книг: "; 
                        cin>>k_b; 
                        cout<<"Введите названия книг: \n";
                        string *books=new string [k_b];
                        for(int i=0;i<k_b;i++) 
                         { 
                             getline(cin,books[i]);
                             
                         } 
                         cout<<endl;
                         
                    }
                                
                void client_library::print()
                {
                    
                    person::print();
                    cout<<"Номер билета: "<<number_b<<endl;
                    cout<<"Дата выдачи: "<<deta<<endl;
                    cout<<"Ежегодный взнос: "<<vnesok*12<<endl;
                    cout<<"Книги: ";
                    for (int i=0;i<k_b;i++)
                    {
                        cout<<books[i];
                    }
                    
                }
        
        
        int main()
        {   
            int n;
            setlocale(LC_ALL,"Russian");
            cout<<"Введите количество человек: ";
            cin>>n;
            cout<<endl;
            client_library a;
            for (int i=0; i<n; i++)
            {
            a.scan();
            a.print();
            a.Zn();
            }
            return 0;
            getch();
    }
Добавлено через 2 минуты
И еще...извините, что так много вопросов..хочу разобраться
Скажите, в начале обязательно писать эти строки? я думала что да, но потом решила проверить, закомментировала, и ничего не изменилось, программа все также успешно работала..

C++
1
2
3
4
5
6
7
8
9
int getnumber_b() {return number_b;}
                string getdeta() {return deta;}
                int getvnesok() {return vnesok;}
                string getbooks () {return books ;}
                
                void setnumber_b(int nBil) {number_b=nBil;}
                void setdeta (string d) {deta=d;}
                void setvnesok (int Vn) {vnesok=Vn;}
                void setbooks (string bk) {books=bk;}
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
30.03.2014, 14:47     Вызов методов производного класса #4
Цитата Сообщение от Федорец Посмотреть сообщение
string *books=new string [k_b]; for(int i=0;i<k_b;i++) { getline(cin,books[i]); }
Это неправильно.
Попробуйте так:
C++
1
2
3
char tmp[100];
getline(cin,tmp);
books.pushback(tmp);
Добавлено через 2 минуты
Строки типа
Цитата Сообщение от Федорец Посмотреть сообщение
int getnumber_b() {return number_b;}
пишутся, если Вы решили предоставить доступ к защищенным данным внешним приложениям.
По возможности этого лучше не делать.
Yandex
Объявления
30.03.2014, 14:47     Вызов методов производного класса
Ответ Создать тему
Опции темы

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