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

Как обратится к обьекту класса, являющегося наследником абстрактного класса - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
31.07.2015, 23:58     Как обратится к обьекту класса, являющегося наследником абстрактного класса #1
Здравствуйте!
У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит
указатель на виртуальный класс (динамический массив, который растет от методов buildCar и buildTruck).
eFuel - это также класс, который содержит еще класс, но в данном вопросе они не принимают участия.
Вопрос: как через указатель четвертого класса доступится к наследующим классам?
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
class aGasStation
{
    friend class bCar;
    friend class cTruck;
protected :
    double A92;
    double A95;
    double A98;
    int cistern92;
    int cistern95;
    int cistern98;
public:
    aGasStation ();
    ~aGasStation ();
    virtual void print () = 0;
};
 
class bCar : public aGasStation
{
    eFuel fuelcar;
public:
    bCar ();
    ~bCar ();
    void print ();
};
 
class cTruck  : public aGasStation
{
    eFuel fueltruck;
public:
    cTruck ();
    ~cTruck ();
    void print ();
};
 
class dChainOfGasStation
{
    aGasStation *base;
    double money;
    static int size;
public:
    dChainOfGasStation ();
    ~dChainOfGasStation ();
    friend void buildCar (dChainOfGasStation *tmp);
    friend void buildTruck (dChainOfGasStation *tmp);
};
C++
1
2
3
4
5
6
7
8
void main ()
{
    dChainOfGasStation base;
    buildCar (&base);
    buildCar (&base);
    buildTruck (&base);
    buildCar (&base);   
}
Пытаюсь таким способом в main(), но знаю что base[0] - это private, а сделать его public противоречит правилам С++
C++
1
base.base[0]->print();
Можно написать set-метод, но каким образом это сделать я не знаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 23:58     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Посмотрите здесь:

Реализация абстрактного класса C++
как исправить Ошибка 8 error C2259: Tabl: невозможно создать экземпляр абстрактного класса C++
Создание объекта класса, являющегося суммой 2ух других C++
как узнать,является данный объект класса А1 наследником класса А2 C++
C++ Как организовать интерфейс в виде абстрактного класса?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
03.08.2015, 14:48     Как обратится к обьекту класса, являющегося наследником абстрактного класса #121
Так связи вся суть модели.

Как к примеру как делать поиск в ширину/глубину по графу без "связей" ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
03.08.2015, 15:03     Как обратится к обьекту класса, являющегося наследником абстрактного класса #122
Цитата Сообщение от Avazart Посмотреть сообщение
Так связи вся суть модели.
Ага. И ими управляет граф. Граф - дружественный класс дугам и вершинам. А вот зачем вершинам и дугам знать что-то конкретное друг о друге?

Цитата Сообщение от Avazart Посмотреть сообщение
Как к примеру как делать поиск в ширину/глубину по графу без "связей" ?
Все будет делать граф. И в смысле без связей? Связи будут, граф про них знает, но для них достаточно неполного типа ребра в файле вершины, и неполного типа вершины в файле ребра (и то это максимум, можно тупо использовать id). Чтобы нужен был прям полный тип, должна там быть еще какая-то логика между ребрами и вершинами. Вот какая например?
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
03.08.2015, 15:08     Как обратится к обьекту класса, являющегося наследником абстрактного класса #123
Цитата Сообщение от ct0r Посмотреть сообщение
А вот зачем вершинам и дугам знать что-то конкретное друг о друге?
Ок мне нужно узнать все соседние вершины к данной, как вы это сделаете без "связей"?
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
03.08.2015, 15:15     Как обратится к обьекту класса, являющегося наследником абстрактного класса #124
Цитата Сообщение от ct0r Посмотреть сообщение
А разве у вершин и ребер должна быть какая-то связанная логика, помимо обычного хранения данных?
вы оригинальный код видели?

это - модель данных, которая описывается взяимосвязями элементов.
при этом количество элементов может быть каким угодно.

такая... ближайшая абстракция - это сетка.

логика здесь заключается в том: "как правильно вязать сетку".
у господина Avazart, за эту логику твечает манагер.

получается, что элементы именно и хранят только данные.
а вот логика связки элементов существует отдельно.

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

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

Цитата Сообщение от ct0r Посмотреть сообщение
Мне кажется, что всей логикой должен заниматься граф.
у меня первая же мысль была такая же, как я только увидел фрагемент кода.
однако, немного поразмыслив, я понял:

можно упразднить класс манагера,
но вся его нагруза целиком ляжет на класс графа

то есть, сложность не уменьшиться.
объем кода тоже не уменьшиться.

то бишь, это тупо перетасовка кода туда-сюда.
без какого бы то нибыло профита.


в варианте от господина Avazart,
мне напротив, нравится то, что принцип связи инкапсулирован от графа.

код получился опрятным.

возможности каждого компонента очевидными.

принцип связи элементов - все в одном месте, это улучшает читабельность,
и мозможные модификации.

перетащите все в граф - ну получится тоже самое по сути,
но более сложное по восприятию.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
03.08.2015, 15:27     Как обратится к обьекту класса, являющегося наследником абстрактного класса #125
К примеру исходящие связи заданной вершины:
C++
1
2
3
4
5
6
EContainer edges= vertex->outEdges();
for(size_t i=0;i<edges.size();++i)  
{
   Vertex* v= edges[i]->to();
   /* ... */
}
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
03.08.2015, 15:35     Как обратится к обьекту класса, являющегося наследником абстрактного класса #126
Цитата Сообщение от hoggy Посмотреть сообщение
вы оригинальный код видели?
это - модель данных, которая описывается взяимосвязями элементов.
при этом количество элементов может быть каким угодно.
такая... ближайшая абстракция - это сетка.
логика здесь заключается в том: "как правильно вязать сетку".
у господина Avazart, за эту логику твечает манагер.
получается, что элементы именно и хранят только данные.
а вот логика связки элементов существует отдельно.
то есть, он отделил элменты,
которые нужно связывать от способа этой вези.
в результате становится легко понять из чего состоит сеть.
а поскольку способ связки инкапсулирован в одном месте,
то более менее легко понять, как происходит связка.
Ну это понятно все. Но в процитированном вами вопросе имелось в виду именно _непосредственное_ взаимодействие между ребрами и вершинами.

Цитата Сообщение от hoggy Посмотреть сообщение
перетащите все в граф - ну получится тоже самое по сути,
но более сложное по восприятию.
Если граф будет при реализации своих алгоритмов обращаться к менеджеру только за нужными вершинами и ребрами, и не будет лезть в них сам, то да, менеджер имеет право существовать.

Цитата Сообщение от Avazart Посмотреть сообщение
все соседние вершины к данной, как вы это сделаете без "связей"?
Опять же не совсем понял, что значит без связей. Лезем в вершину, берем смежные дуги. Лезем в эти дуги, оттуда берем как раз соседние вершины.

Добавлено через 1 минуту
Avazart, может мы не понимаем друг друга? Я везде имею в виду непосредственную связь между вершинами и дугами. Против приведенного куска кода я ничего не имею.
Ferrari F1
Заблокирован
298 / 284 / 62
Регистрация: 27.01.2015
Сообщений: 1,912
Записей в блоге: 1
Завершенные тесты: 1
03.08.2015, 15:38     Как обратится к обьекту класса, являющегося наследником абстрактного класса #127
Госпади, сколько флуда развели изза простой задачки
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
03.08.2015, 15:49     Как обратится к обьекту класса, являющегося наследником абстрактного класса #128
Цитата Сообщение от ct0r Посмотреть сообщение
Avazart, может мы не понимаем друг друга? Я везде имею в виду непосредственную связь между вершинами и дугами. Против приведенного куска кода я ничего не имею.
Ты имеешь в виду под "связями" контроль существования объектов?
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
03.08.2015, 15:53     Как обратится к обьекту класса, являющегося наследником абстрактного класса #129
Цитата Сообщение от Avazart Посмотреть сообщение
Ты имеешь в виду под "связями" контроль существования объектов?
Под связями я имел в виду вообще какое-то взаимодействие между ними. То есть вызов из класса вершины метода класса ребра или доступ к его данным. И наоборот. И контроль существования тоже сюда входит (потому как конструкторы и деструкторы).
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
03.08.2015, 15:56     Как обратится к обьекту класса, являющегося наследником абстрактного класса #130
Хз, без примера кода я не понимаю о чем вы...

Конечно если отказаться от "интерфейса"
C++
1
delete  vertex;
и заменить к примеру
C++
1
graph.removeVertex(Vertex* v) { /*Удаление связей*/; delete v; }
То да вероятно можно будет несколько упростить.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
03.08.2015, 16:02     Как обратится к обьекту класса, являющегося наследником абстрактного класса #131
Цитата Сообщение от Avazart Посмотреть сообщение
Хз, без примера кода я не понимаю о чем вы...
Ну например. Нам нужно получить соседние вершины у текущей. Есть два способа:
1) Сделать это функцией менеджера. Он лезет в вершину, забирает оттуда ребра, лезет в каждое ребро и забирает соседние вершины.
2) Сделать это функцией вершины. Она сама лезет по смежным ребрам и возвращает соседние вершины.
Тебе какой вариант больше нравится?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2015, 16:12     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Еще ссылки по теме:

Как при помощи указателя на базовый класс обратится к полю наследуемого класса? C++
C++ Использование абстрактного класса
C++ Как полю класса А обратится к приватной функции класса А?

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
03.08.2015, 16:12     Как обратится к обьекту класса, являющегося наследником абстрактного класса #132
Первый, потому как дает шире возможности для написания разных алгоритмов, а не одного конкретного.
Я лишь привел задачу как пример.
Yandex
Объявления
03.08.2015, 16:12     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Ответ Создать тему
Опции темы

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