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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
devx
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 5
#1

Указатели при наследовании классов - C++

30.04.2013, 16:15. Просмотров 522. Ответов 7
Метки нет (Все метки)

Здравствуйте , заданием было реализовать однонаправленный список как класс и затем используя механизм наследования создать базу данных на основе списка

список я реализовал , добавил функции создания первого элемента и последующих , прохода всех элементов ,
последним шагом через наследование добавил некоторые поля но столкнулся с проблемой, что указатели на которых всё работало имеют доступ только к полям и функциям класса list , как можно решить эту проблему?
заранее благодарен за помощь
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
class list{
public:
list *next;
 
void create(){
list *q=new list;
q->next=NULL;
ph=q;
p=q;
}
 
void add(list *x){
list *q=new list;
x->next=q;
q->next=NULL;
p=q;
}
void show(list *ph){
    for(p=ph;p!=NULL;p=p->next){
    //вывести нужные значения по указателю
    }
    }
}*ph,*p;
 
class database:public list{
public:
int rooms();
int floor;
float S;
char adress[30];
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XRuZzz
Антикодер
615 / 516 / 26
Регистрация: 15.09.2012
Сообщений: 2,457
30.04.2013, 16:32     Указатели при наследовании классов #2
по моему указатели имеют доступ к унаследованных полям и функциям класса list
то есть у экземпляра класса database будут свои(скопированные) поля и функции унаследованные от list.

Не понятно, что вас смущает, и что вы пытаетесь сделать.
devx
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 5
30.04.2013, 16:42  [ТС]     Указатели при наследовании классов #3
Цитата Сообщение от XRuZzz Посмотреть сообщение
по моему указатели имеют доступ к унаследованных полям и функциям класса list
то есть у экземпляра класса database будут свои(скопированные) поля и функции унаследованные от list.

Не понятно, что вас смущает, и что вы пытаетесь сделать.
я могу создать объект типа database и вызвать функции описанные в классе list , но эти функции работают от указателей типа list и по этим указателям я не могу производить запись в поля из database , как то так
XRuZzz
Антикодер
615 / 516 / 26
Регистрация: 15.09.2012
Сообщений: 2,457
30.04.2013, 17:14     Указатели при наследовании классов #4
прочитать только первое предложение

Добавлено через 19 минут
после того как отформатировал код до меня дошло что у вас проблема на 23 строке
C++
1
}*ph,*p;
глобальные указатели лучше не использовать тем более внутри класса.
devx
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 5
30.04.2013, 17:19  [ТС]     Указатели при наследовании классов #5
Цитата Сообщение от XRuZzz Посмотреть сообщение
прочитать только первое предложение

Добавлено через 19 минут
после того как отформатировал код до меня дошло что у вас проблема на 23 строке
C++
1
}*ph,*p;
глобальные указатели лучше не использовать тем более внутри класса.
тоесть указатели лучше объявить внутри public?
XRuZzz
Антикодер
615 / 516 / 26
Регистрация: 15.09.2012
Сообщений: 2,457
30.04.2013, 17:46     Указатели при наследовании классов #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
#include <iostream>
using namespace std;
class list
{
    public:
        list *next;
        list *ph;
        list *p;
        void create()
        {
            list *q = new list;
            q->next = NULL;
            ph = q;
            p = q;
        }
 
        void add(list *x)
        {
            list *q = new list;
            x->next = q;
            q->next = NULL;
            p = q;
        }
        void show(list *ph)
        {
            for (p = ph; p != NULL; p = p->next)
            {
                //вывести нужные значения по указателю
                cout<< p <<' ';
            }
            cout<< endl;
        }
};
 
class database: public list
{
    public:
        int rooms();
        int floor;
        float S;
        char adress[30];
//      database *p;
        void show(list *ph)
        {
            for (p = ph; p != NULL; p = p->next)
            {
                //вывести нужные значения по указателю
                database *pG;
                pG = (database *)p;
                cout<< pG->floor <<' ';
            }
            cout<< endl;
        }
};
 
int main ()
{
    list ll, newLL;
    database db, newDb;
    ll.add(&newLL);
    ll.create();
    ll.show(&newLL);
    newDb.floor = 4;
    db.add(&newDb);
    db.show(&newDb);
    return 1;
}
чтоб получить доступ к полям database нужно выполнить преобразование типа из указателя
C++
1
pG = (database *)p;

у меня с глобальными *ph,*p даже не компилируется, а у вас компилируется? без предупреждений?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class list{
public:
list *next;
 
void create(){
list *q=new list;
q->next=NULL;
ph=q;
p=q;
}
 
void add(list *x){
list *q=new list;
x->next=q;
q->next=NULL;
p=q;
}
void show(list *ph){
    for(p=ph;p!=NULL;p=p->next){
    //вывести нужные значения по указателю
    }
    }
}*ph,*p;
Добавлено через 2 минуты
Цитата Сообщение от devx Посмотреть сообщение
тоесть указатели лучше объявить внутри public?
в идеале в секцию private
devx
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 5
30.04.2013, 17:46  [ТС]     Указатели при наследовании классов #7
да компилировалось , спасибо , вроде разобрался , и я так понимаю функция show() в database перекрывает ранее объявленную в list?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2013, 17:53     Указатели при наследовании классов
Еще ссылки по теме:

Деструктор при наследовании C++
C++ Присвоение при наследовании
Как вернуть функцию, которая потерялась при наследовании классов? C++
Ошибка при наследовании C++
Ошибка при наследовании C++

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

Или воспользуйтесь поиском по форуму:
XRuZzz
Антикодер
615 / 516 / 26
Регистрация: 15.09.2012
Сообщений: 2,457
30.04.2013, 17:53     Указатели при наследовании классов #8
ну да, как раз хороший момент, чтоб изучить виртуальное поведение методов, добавив слово virtual в каждом классе у метода show и посмотреть, что будет, при обращении из указателя базового класса на экземпляр производного класса к этому методу show
Yandex
Объявления
30.04.2013, 17:53     Указатели при наследовании классов
Ответ Создать тему
Опции темы

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