Форум программистов, компьютерный форум 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
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 01:06     Как обратится к обьекту класса, являющегося наследником абстрактного класса #21
Цитата Сообщение от Eraston Посмотреть сообщение
В классе 20 переменных, для каждой писать гетсеты?
Обязательно.

Добавлено через 1 минуту
Eraston, Почитайте книгу Саттера и прекращайте быдлокодить....
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 01:10     Как обратится к обьекту класса, являющегося наследником абстрактного класса #22
Avazart, грань между инкапсуляцией и сокрытием довольно тонкая.
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 01:15  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #23
Цитата Сообщение от Avazart Посмотреть сообщение
Как то так:
это просто прям отличный образец кода, то что надо! точно же, можно было использовать шаблонный класс, чтоб упростить дело с массивами
Цитата Сообщение от Avazart Посмотреть сообщение
Что выносить в базовый класс(общее) а что нет, и вообще смысл всего этого.
вот поэтому общее (это марки бензина и цистерны) я вынесла в абстрактный класс, а их различия (цена бензина и макс объем цистерн) уже инициализировала отдельно в классах

private-члены ни при каких условиях потомкам не переходят.
и вот поэтому сделала поля защищенными, чтоб использовать общие поля (я никак не могла припомнить почему нам говорили делать эти поля защищенными, но теперь я этого уж точно не забуду)
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 01:15     Как обратится к обьекту класса, являющегося наследником абстрактного класса #24
Avazart, я согласен, что необходимо полностью закрывать доступ к членам сложных типов данных типа (TreeNode, File, List, Table, Array и пр. являющихся составными, и, тем более, работающих с указателями), но абсолютно не вижу смысла закрывать простые int'ы c float'ами. Возможно, с практикой и опытом моё мнение и изменится.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 01:21     Как обратится к обьекту класса, являющегося наследником абстрактного класса #25
Инкапсуляция подразумевает скрытие, или точнее сказать ограничение доступа, "скрытие внутренностей".

Добавлено через 3 минуты
Цитата Сообщение от irises Посмотреть сообщение
вот поэтому общее (это марки бензина и цистерны) я вынесла в абстрактный класс, а их различия (цена бензина и макс объем цистерн) уже инициализировала отдельно в классах
Ну это не такое уже и различие если учесть что эти поля можно задавать при создании и менять в процессе через конструктор или сетторы.
Разница была бы если бы к примеру на "грузовой заправке" продавалась бы еще дизель топливо к примеру.
Если уже должно быть "жестко" заданые значения то вероятно стоит использовать сonst- переменные, для итовых еще можно "переопределять" enum
Да и вероятно конструктор с параметрами базового класса вероятно стоит сделать protected.

Добавлено через 55 секунд
Цитата Сообщение от irises Посмотреть сообщение
и вот поэтому сделала поля защищенными, чтоб использовать общие поля (я никак не могла припомнить почему нам говорили делать эти поля защищенными, но теперь я этого уж точно не забуду)
Не нужно их делать защищенными, защищенными обычно делаю методы, а не члены класса.
Члены класса- закрытыми.
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 01:28  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #26
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это не такое уже и различие если учесть что эти поля можно задавать при создании и менять в процессе.
Разница была бы если бы к примеру на "грузовой заправке" продавалась бы еще дизель топливо к примеру.
ну почему же задавать, они прописаны в конструкторе по умолчанию и в процессе уже никак не меняются

Цитата Сообщение от Avazart Посмотреть сообщение
Не нужно их делать защищенными, защищенными обычно делаю методы, а не члены класса.
Члены класса- закрытыми.
хорошо, убедили, я исправлю свой код и буду учится сразу писать правильно, ведь даже если будет хоть 20 переменных, то нужно делать 40 методов (set и get)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 01:33     Как обратится к обьекту класса, являющегося наследником абстрактного класса #27
Ну так методов вобще может не быть.
К примеру геттер в вашем случае может присутствовать, а сеттеры могут и отсутствовать- т.е не будет возможности изменить значение. Для этого собственно и разделяется доступ на геттеры и сеттры.
Более того сеттеры и геттеры могу делать что-то еще помимо установки значения так называемое "последействие" и повидение может менятся от базового члена класса к наследникам, чего не достикнуть если открывать/"защищать" членны-данные.
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 01:38  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #28
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так методов вобще может не быть.
это я образно, все зависит от способа написания программы, иногда нужно только сеттеры или только геттеры, или то и другое одновременно
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,231
01.08.2015, 01:42     Как обратится к обьекту класса, являющегося наследником абстрактного класса #29
Цитата Сообщение от Eraston Посмотреть сообщение
но абсолютно не вижу смысла закрывать простые int'ы c float'ами. Возможно, с практикой и опытом моё мнение и изменится.
Напишите класс Дробь у которого открты поля знаменатель и числитель, и дайте друзьям "поиграться" и засекайте за сколько минут у них кританёт и они напишут, что ваш код гавно после кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Drob
    {
    public:
        int x;
        int y;
 
        float       toFloat() const
        {
            return x*1.0 / y;
        }
    };
 
 
Drob a(10, 0);
cout << a.toFloat() << endl;
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 02:02     Как обратится к обьекту класса, являющегося наследником абстрактного класса #30
Цитата Сообщение от irises Посмотреть сообщение
это я образно, все зависит от способа написания программы, иногда нужно только сеттеры или только геттеры, или то и другое одновременно
А может примеру и так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public:
    enum Mark{ A92,A95,A98 }; 
// A92= 0 ,A95= 1, A98= 2 - будут использоваться как индексы массива.
 
    const double& benzine(Mark mark)const{  return  A_[mark]; } // геттер
    double& benzine(Mark mark){  return  A_[mark]; } // по сути сеттер
 
private:
    double A_[3];// A92,A95,A98
}
 
//
 
double a95= station.benzine(AbstractGusStation::A95);
station.benzine(A95)+= 5; // Увеличиваем на 5 значение засчет возврата ссылки
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 02:08     Как обратится к обьекту класса, являющегося наследником абстрактного класса #31
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Напишите класс Дробь у которого открты поля знаменатель и числитель, и дайте друзьям "поиграться" и засекайте за сколько минут у них кританёт и они напишут, что ваш код гавно после кода
Нет ума - нефиг лезть. Проверки имеются для таких случаев. Кто сказал, что они смогут с ними поиграться, если они будут protected? В случае необходимости проверки, автоматически требуется метод.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 02:11     Как обратится к обьекту класса, являющегося наследником абстрактного класса #32
Eraston, Тебе намекают что проверка может быть в сетторе и тогда уже не поиграешься.
smartpointer
 Аватар для smartpointer
64 / 58 / 23
Регистрация: 17.02.2014
Сообщений: 250
01.08.2015, 02:19     Как обратится к обьекту класса, являющегося наследником абстрактного класса #33
Лишнее движение - обращаться по адресу функции, чтобы получить переменную, когда ее можно получить напрямую - только для унаследованных детей. Писать 20 геттеров это вообще лол. Давайте уж тогда правильнее будем писать не один геттер, а два - итого 60 методов для 20 переменных (допустим, что хочу пользоваться всеми).
C++
1
2
inline const int& Get()const{return my_int;}
inline int& Get(){return my_int;}
Иногда можно отступить от правил, и не доходить до бреда и мазохизма, и быдлокодом тут даже не пахнет.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 02:29     Как обратится к обьекту класса, являющегося наследником абстрактного класса #34
smartpointer, Почитайте про inline может поймете в чем заблуждаетесь.

Добавлено через 3 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
допустим, что хочу пользоваться всеми).
Вопрос зачем, если для получения значения достаточно одного??

Добавлено через 2 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
Иногда можно отступить от правил, и не доходить до бреда и мазохизма, и быдлокодом тут даже не пахнет.
Может вспомнить что прввила не прото так придумали? Это тшательность и даьновидность, а не бред. А вот делать вопреки тут - ленью попахивает.
smartpointer
 Аватар для smartpointer
64 / 58 / 23
Регистрация: 17.02.2014
Сообщений: 250
01.08.2015, 02:37     Как обратится к обьекту класса, являющегося наследником абстрактного класса #35
Цитата Сообщение от Avazart Посмотреть сообщение
Почитайте про inline может поймете в чем заблуждаетесь.
Я в курсе про инлайн, упор именно на то, зачем расширять интерфейс класса, когда можно взять значение напрямую(сама функция тоже хранится по адресу и занимает память).
Цитата Сообщение от Avazart Посмотреть сообщение
Вопрос зачем, если для получения значения достаточно одного??
Мда вот тут я попался, действительно тогда и сеттер не нужен, если возращать не по константной ссылке.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 02:47     Как обратится к обьекту класса, являющегося наследником абстрактного класса #36
Цитата Сообщение от smartpointer Посмотреть сообщение
сама функция тоже хранится по адресу и занимает память
Ну так выравнивание тоже занимает память... и че?

Добавлено через 2 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
inline int& Get(){return my_int;}
Ну это по сути и есть сеттер.

Добавлено через 1 минуту
Цитата Сообщение от smartpointer Посмотреть сообщение
зачем расширять интерфейс класса
Не расширять, а поддерживать его. Интерфейс как раз- методы, а не данные.

Добавлено через 42 секунды
Цитата Сообщение от smartpointer Посмотреть сообщение
когда можно взять значение напрямую(
Потому что это будет напрямую, а не косвенно.

Кода в иерархии два уровня все кажется простым, но когда больше и кода ваши классы пытается использовать кто-то другой вы даете ему возможность ошибиться.
smartpointer
01.08.2015, 02:50
  #37

Не по теме:


Цитата Сообщение от Avazart Посмотреть сообщение
Ну так выравнивание тоже занимает память... и че?
Кому очень надо воспользуются #pragmа pack. Что он там еще пишет ? Может напишем ему(он там вроде в комитете по стандартам засидает) пускай выпиливает protected и friend-ы - ибо инкапсуляция превыше всего !?

Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 02:54     Как обратится к обьекту класса, являющегося наследником абстрактного класса #38
Цитата Сообщение от smartpointer Посмотреть сообщение
Кому очень надо воспользуются #pragmа pack.
Ну ну ... может покинете ветку С++? К примеру свалите в Си и будете говорить какой хороший Асм ?

Про protected я уже написал он "для методов".
friend стоит использовать осторожно, в данном случае он ни к чему.
smartpointer
 Аватар для smartpointer
64 / 58 / 23
Регистрация: 17.02.2014
Сообщений: 250
01.08.2015, 03:01     Как обратится к обьекту класса, являющегося наследником абстрактного класса #39
Цитата Сообщение от Avazart Посмотреть сообщение
Ну ну ... может покинете ветку С++? К примеру свалите в Си и будете говорить какой хороший Асм ?
Что за ненависть к сишникам ? Асм не знаю - честно
Цитата Сообщение от Avazart Посмотреть сообщение
Про protected я уже написал он "для методов". friend стоит использовать в "крайних" случаях.
Работаю с библиотекой где активно используются float,bool и прочее как protected - конкурент QT, быдлокодеры ?
Про friend-ы интересно - расскажите (ну или ссылку на крайняк)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 03:17     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
01.08.2015, 03:17     Как обратится к обьекту класса, являющегося наследником абстрактного класса #40
Цитата Сообщение от smartpointer Посмотреть сообщение
Что за ненависть к сишникам ? Асм не знаю - честно
А откуда страсть нарушать инкапсуляцию мотивируя расходом памяти?

Добавлено через 3 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
Про friend-ы интересно - расскажите (ну или ссылку на крайняк)?
А что расказывать friend нарушает инкапсуляцию... что-то новое? Из чего применять его следует только кода иначе просто нельзя.
К примеру, если нужно запретить создавать объекты напрямую через конструкторы.

Добавлено через 8 минут
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
class CarGasStation : public AbstractGasStation
{ 
   friend class ChainOfGasStation;
   protected:
       CarGasStation(){/**/};
  // твой код
};
 
class TruckGasStation : public AbstractGasStation
{
   friend class ChainOfGasStation;
   protected:
     TruckGasStation(){/**/};
  // твой код
};
 
class ChainOfGasStation
{
  public:
     ChainOfGasStation ();
    ~ChainOfGasStation ()
     {  
       clear();
     };
 
    void clear()
   {
       for(size_t i=0;i<station_.size();++i) 
          delete station_[i]; 
       stations_.clear();
   }
 
    AbstractGasStation*  addCarGasStation()
    { 
        AbstractGasStation*  station= new CarGasStation;
        stations_.push_back(station);   
        return station;    
    }  
 
    AbstractGasStation*  addTruckGasStation()
    { 
        AbstractGasStation*  station= new TruckGasStation;
        stations_.push_back(station);   
        return station;    
    }  
 
 
    AbstractGasStation* station(size_t index)
    {
       return stations_.at(index);
    }
   
    size_t size() const
   {
      return station_.size();
   }
 
  private:
     std::vector<AbstractGasStation*> stations_; // Либо массив что усложнит задачу.
};
// ....
ChainOfGasStation  сhain;
сhain.addCarGasStation();
сhain.addTruckGasStation();
 
// TruckGasStation*  truckStation= new TruckGasStation; // Ошибка.
Yandex
Объявления
01.08.2015, 03:17     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Ответ Создать тему
Опции темы

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