Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 30.04.2013
Сообщений: 5
1

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

30.04.2013, 16:15. Просмотров 1543. Ответов 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];
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2013, 16:15
Ответы с готовыми решениями:

Что происходит при наследовании классов?
Гуглил тут одну тему про наследование и коде встретилась строчка: D d; Что в ней конкретно...

Выделение памяти при наследовании классов
Здравствуйте! У меня есть метод который, читает память занимаемую классом. Есть несколько базовых...

Ошибка компиляции при наследовании классов
У меня есть класс CNew который наследует класс CTransport но при компиляции выводит ошибку ниже 4...

Ошибка Type missmatch при наследовании классов
При создании объекта класса Chord появляется ошибка: E2356 Type mismatch in redeclaration of...

7
Антикодер
1855 / 831 / 47
Регистрация: 15.09.2012
Сообщений: 2,969
30.04.2013, 16:32 2
по моему указатели имеют доступ к унаследованных полям и функциям класса list
то есть у экземпляра класса database будут свои(скопированные) поля и функции унаследованные от list.

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

Не понятно, что вас смущает, и что вы пытаетесь сделать.
я могу создать объект типа database и вызвать функции описанные в классе list , но эти функции работают от указателей типа list и по этим указателям я не могу производить запись в поля из database , как то так
0
Антикодер
1855 / 831 / 47
Регистрация: 15.09.2012
Сообщений: 2,969
30.04.2013, 17:14 4
прочитать только первое предложение

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

Добавлено через 19 минут
после того как отформатировал код до меня дошло что у вас проблема на 23 строке
C++
1
}*ph,*p;
глобальные указатели лучше не использовать тем более внутри класса.
тоесть указатели лучше объявить внутри public?
0
Антикодер
1855 / 831 / 47
Регистрация: 15.09.2012
Сообщений: 2,969
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
1
0 / 0 / 1
Регистрация: 30.04.2013
Сообщений: 5
30.04.2013, 17:46  [ТС] 7
да компилировалось , спасибо , вроде разобрался , и я так понимаю функция show() в database перекрывает ранее объявленную в list?
0
Антикодер
1855 / 831 / 47
Регистрация: 15.09.2012
Сообщений: 2,969
30.04.2013, 17:53 8
ну да, как раз хороший момент, чтоб изучить виртуальное поведение методов, добавив слово virtual в каждом классе у метода show и посмотреть, что будет, при обращении из указателя базового класса на экземпляр производного класса к этому методу show
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2013, 17:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как вернуть функцию, которая потерялась при наследовании классов?
Предположим есть два класса: class Parent { public: void foo() { std::cout &lt;&lt; &quot;parent foo &quot; &lt;&lt;...

Про распределение памяти и указатели? При создании классов
Продолжаю изучать тему указателей вот возник следующий вопрос про выделение памяти. Прошу...

о связи классов и наследовании даты
#ifndef base_hpp #define base_hpp #include &quot;Data.hpp&quot; #include &lt;iostream&gt; using namespace...

Использование шаблонов при наследовании, ошибка при компиляции
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от...


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

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

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