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

Создать иерархию классов язык с++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Ази
0 / 0 / 0
Регистрация: 16.03.2014
Сообщений: 7
16.03.2014, 21:10     Создать иерархию классов язык с++ #1
Создать иерархию классов язык с++
Жидкость<-Напиток
Жидкость<-Топливо
Жидкость<-Реагент
Жидкость - абстрактный класс? инкапсулирует свойства цвет, название, температура замерзания/кипения и т.д., а также виртуальный метод Boil. Классы Напиток, Топливо, Реагент реализуют метод Boil(реализация на свое усмотрение)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 21:10     Создать иерархию классов язык с++
Посмотрите здесь:

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы C++
C++ Создать иерархию классов корабль – пассажирский пароход
Создать абстрактный базовый класс объектов на декартовой плоскости CShape и разработать иерархию классов конкретных фигур C++
C++ Создать иерархию классов датчик
Не получается создать иерархию классов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
17.03.2014, 09:43     Создать иерархию классов язык с++ #2
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
#include <iostream>
#include <string>
 
// базовый абстрактный класс жидкость
class Liquid
{
public:
    Liquid(): color() {}
    Liquid(const std::string &c): color(c) {}
    virtual ~Liquid() {} // базовый класс должен иметь вирт. деструктор
    virtual void boil() = 0; // чисто виртуальная функция
protected:
    std::string color;
    // some other
};
 
// наследнички
class Drink: public Liquid
{
public:
    // реализация чисто виртуального метода - класс больше не абстрактный
    void boil() { std::cout << "Drink::boil()\n"; }
};
 
class Fuel: public Liquid
{
public:
    void boil() { std::cout << "Fuel::boil()\n"; }
};
 
class Reagent: public Liquid
{
public:
    void boil() { std::cout << "Reagent::boil()\n"; }
};
 
int main()
{
   // Liquid l; // error - абстрактный класс не может иметь реализацию в виде объектов
   Liquid *p = new Reagent; // OK
   p->boil();               // Reagent::boil()
   Liquid *p2 = NULL;       // OK
   p2 = new Drink;          // OK
   p2->boil();              // Drink::boil()
   // освобождаем память
   delete p;
   delete p2;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2014, 10:07     Создать иерархию классов язык с++ #3
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
/*
Создать иерархию классов 
Жидкость<-Напиток
Жидкость<-Топливо
Жидкость<-Реагент
Жидкость - абстрактный класс? инкапсулирует свойства цвет, название, температура замерзания/кипения и т.д., 
а также виртуальный метод Boil. Классы Напиток, Топливо, Реагент реализуют метод Boil(реализация на свое усмотрение)
*/
 
#include <iostream>
#include <string>
 
class Aqua {
private:
    std::string m_name;
    std::string m_color;
    double m_boiling_point;
    double m_freezing_point;
public:
    Aqua(const std::string & name, const std::string & color, double boiling, double freezing) : m_name(name), m_color(color), 
        m_boiling_point(boiling), m_freezing_point(freezing) {}
    std::string getName() const { return m_name; }
    std::string getColor() const { return m_color; }
    double getBoilingPoint() const { return m_boiling_point; }
    double getFreezingPoint() const { return m_freezing_point; }
    virtual std::string boil() const = 0;
    virtual ~Aqua() {}
};
 
class Drink : public Aqua {
public:
    Drink(const std::string & name, const std::string & color, double boiling, double freezing) : Aqua(name, color, boiling, freezing) {}
    virtual std::string boil() const { return "Many boubles..."; }
};
 
class Fuel : public Aqua {
public:
    Fuel(const std::string & name, const std::string & color, double boiling, double freezing) : Aqua(name, color, boiling, freezing) {}
    virtual std::string boil() const { return "CRUSH AND BURN!!!"; }
};
 
class Reagent : public Aqua {
public:
    Reagent(const std::string & name, const std::string & color, double boiling, double freezing) : Aqua(name, color, boiling, freezing) {}
    virtual std::string boil() const { return "So strange smell here..."; }
};
 
int main() {
    Aqua * examples[3];
    examples[0] = new Drink("Clear water", "Limpid", 100.0, 0.0);
    examples[1] = new Fuel("Gazoline", "Brown", 90.0, -30.0);
    examples[2] = new Reagent("Lakmus", "Green", 120.0, -10.0);
    
    for ( int i = 0; i < 3; ++i )
        std::cout << "Object #" << (i + 1) << "\nName: " << examples[i]->getName() << "\nColor: " << examples[i]->getColor()
            << "\nBoiling poing: " << examples[i]->getBoilingPoint() << "\nFreezing point: " << examples[i]->getFreezingPoint()
            << "\nWhen boil: " << examples[i]->boil() << std::endl;
    
    for ( int i = 0; i < 3; ++i )
        delete examples[i];
    
    return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.03.2014, 11:47     Создать иерархию классов язык с++ #4
По крайней мере
Цитата Сообщение от easybudda Посмотреть сообщение
C++
1
2
double m_boiling_point; 
double m_freezing_point;
следует сделать константами. А метод boil(), имхо, не должен быть константным.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2014, 14:50     Создать иерархию классов язык с++ #5
Цитата Сообщение от Tulosba Посмотреть сообщение
следует сделать константами
В чём профит? Закрытые члены класса, сеттеров нет и не предвидится...
Цитата Сообщение от Tulosba Посмотреть сообщение
А метод boil(), имхо, не должен быть константным.
Менял бы какие-нибудь поля класса - был бы неконстантным.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.03.2014, 15:08     Создать иерархию классов язык с++ #6
Цитата Сообщение от easybudda Посмотреть сообщение
В чём профит? Закрытые члены класса, сеттеров нет и не предвидится...
Во-первых, лучше отражает состояние реального мира.
Во-вторых, базовый класс всё же не застрахован от изменения. А следовательно, может быть добавлена функция, которая будет менять то, что не должно быть изменчивым по своей природе (температура кипения в частности (если конечно не будет менять давление) ).
В-третьих, (не уверен) дополнительные возможности оптимизации для компилятора.
Цитата Сообщение от easybudda Посмотреть сообщение
Менял бы какие-нибудь поля класса - был бы неконстантным.
В данном (частном) случае безусловно имеет место быть const (из-за ограниченного набора полей в классе), однако, если возвращаться к упомянутому мной п.1, то кипение изменяет агрегатное состояние вещества (по сути, жидкость уже становится паром), которое вполне может быть добавлено как поле в дочерний класс (или даже в базовый), а вот перегрузить const функцию ее не-const версией уже не получится. Придется обходить ситуацию через mutable например.
easybudda
17.03.2014, 15:14
  #7

Не по теме:

Tulosba, при вашем подходе класс "ЯичнаяСкорлупа" можно до глубокой старости писать, и всё время чуть-чуть не комильфо будет. Для учебного примера тут и так много неочевидного.

Tulosba
17.03.2014, 15:19
  #8

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
при вашем подходе
Просто странно было видеть наличие const там где не надо, и его отсутствие там где оно по всей логике должно быть.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 15:47     Создать иерархию классов язык с++
Еще ссылки по теме:

Создать иерархию классов Шахматная фигура – абстрактный класс, содержащий поле – цвет. Создать производные классы C++
Создать иерархию из трех классов для решения системы 2 уравнений с 2 неизвестными C++
C++ Создать иерархию классов, представляющих простое наследование. Базовый класс – строка символов (char *)

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2014, 15:47     Создать иерархию классов язык с++ #9
Цитата Сообщение от Tulosba Посмотреть сообщение
Просто странно было видеть наличие const там где не надо, и его отсутствие там где оно по всей логике должно быть.
Логика бывает разная. К примеру, если функция boil() задумана, как чисто информативная, выдающая строку с описанием процесса кипения, то переделка её под другие цели в классах наследниках - уже не здоровая идея. С другой стороны температура кипения действительно может изменяться в зависимости от внешних условий и тогда костылей понадобится гораздо больше. Так, что, какое задание, такое и решение.
Yandex
Объявления
17.03.2014, 15:47     Создать иерархию классов язык с++
Ответ Создать тему
Опции темы

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