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

Можно ли как-то в дочернем классе получить указатель родителя? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перенос программы в Windows Forms http://www.cyberforum.ru/cpp-beginners/thread1143620.html
Срочно нужно перенести код консольного приложения в с++ Буду очень признателен. Минимальный интерфейс. 1 текстовое поле для результата. 1 выдвижное меню для выбора тональности. #include <iostream> #include <locale> #include <conio.h> using namespace std; int main() {
C++ Дана последовательность Последовательность x1, x2, ... образована по закону (См. картинку) (i=1,2, ...). Дано действительное число e>0. Записать в файл h члены последовательности x1, x2, ..., остановившись после первого члена для которого выполнено |xi|<e http://www.cyberforum.ru/cpp-beginners/thread1143618.html
Вычисление высоты дерева C++
Всем привет! Дерево создано на основе стека, но вот в чем беда компилируется с ошибкой error C4703: используется потенциально неинициализированная локальная переменная-указатель "p" Не пойму как исправить не переписывая полностью программу) #include "stdafx.h" #include "stdio.h" #include <locale.h> #include <iostream> using namespace std;
C++ Несколько исходников в проекте
Возможно ли создание проекта с несколькими исходными файлами и одним, так сказать "головным"? То есть я не хочу всё писать в один файл, а хочу разбросать код по каждому файлу, для упрощения. Если можно, то как потом подключать вспомогательные .cpp файлы в главный файл?
C++ Как привязать цветовые координаты (rgb и hsl) к картинке http://www.cyberforum.ru/cpp-beginners/thread1143608.html
Подскажите пожалуйста!!! Как привязать цветовые координаты (rgb и hsl) к картинке в c++.
C++ Переведите с Pascal на C++ Пожалуйста, переведите на C++ var a:array of longint; n,m,i,j,i1,j1,max:Longint; begin read(n,m); for i:=0 to n-1 do for j:=0 to m-1 do read(a); max:=a; i1:=0; подробнее

Показать сообщение отдельно
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
11.04.2014, 10:30     Можно ли как-то в дочернем классе получить указатель родителя?
Цитата Сообщение от newbie666 Посмотреть сообщение
нежели в пользу какого - то оптимального паттерна
Ты хотя бы один паттерн-то назови?
Цитата Сообщение от newbie666 Посмотреть сообщение
выглядят сомнительно
То есть ты никогда не применял этот подход? Если не применял, то тогда не понятна твоя уверенность в соей правоте.

Цитата Сообщение от newbie666 Посмотреть сообщение
Но Qt я всё таки знаю
Ну так в чем проблема поcмотреть на MVC?

Добавлено через 30 минут
newbie666,
Ну на вот тебе пример. Основная идея в main();
С полиморфизмом.

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class FlyingMachine
{
public:
    virtual void tryToFly(Pilot const &) = 0;
};
 
class Helicopter : public FlyingMachine
{
public:
    Helicopter(Position const & pos)
        : engine_()
        , rotor_(engine_), tailRotor_(engine_)
        , ctrl_(engine_, rotor_, tailRotor_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        // пилом проверяет систему
        pilot.enable(ctrl_, HeliControlPanel::checkSystem);
        // запуск двигателя
        pilot.enable(ctrl_, HeliControlPanel::startEngine);
        // ждем нужной скорости
        pilot.wait(ctrl_, HeliControlPanel::setEngineTakeoffMode); 
        // тяга вверх,
        pilot.enable(ctrl_, HeliControlPanel::up);
        // режим полета
        pilot.enable(ctrl_, HeliControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboShaft engine_;
 
    Rotor     rotor_;
    TailRotor tailRotor_;
 
    HeliControlPanel ctrl_;
};
 
class Aeroplane : public FlyingMachine
{
public:
    Aeroplane(Position const & pos)
        : leftEngine_(), rightEngine_()
        , ctrl_(leftEngine_, rightEngine_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        pilot.busy();
 
        // пилом проверяет систему
        pilot.enable(ctrl_, JetControlPanel::checkSystem);
        // запуск двигателя
        pilot.enable(ctrl_, JetControlPanel::startEngine);
        // перевод двигателя в режим взлета
        pilot.enable(ctrl_, JetControlPanel::setEngineTakeoffMode);
        // разгон и ожидание набора нужной скорости
        pilot.wait(ctrl_, JetControlPanel::racing);
        // выпустить закрылки
        pilot.enable(ctrl_, JetControlPanel::releaseFlaps);
        // тяга вверх
        pilot.enable(ctrl_, JetControlPanel::up);
        // режим полета
        pilot.enable(ctrl_, JetControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboJet leftEngine_;
    TurboJet rightEngine_;
 
    JetControlPanel ctrl_;
};
 
// Теперь использование
int main()
{
    // некая функция, возвращает эскадрилью летательных аппаратов
    std::vector<FlyingMachine *> squadron = takeSquadron();
    // запустим их в воздух
    // для простоты не сажаю их непосредственно в машину, хотя можно было бы,
    // только кода станет больше.
    for(size_t i = 0, size = squadron.size(); i < size; ++i)
    {
        Pilot & pilot = getFreePilot(); // получим свободного
        squadron[i]->tryToFly(pilot);
        pilot.busy(); // занят
    }
    // Мы можем спокойно добавлять любые аппараты в эскадрилью - этот код не нужно будет менять
}

Без полиморфизма (на самом деле он там есть, только реализованный вручную).

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Теперь без наследования и полиморфизма,
// классы оставляю прежними, только убираю наследование и базовый класс
 
class Helicopter
{
public:
    Helicopter(Position const & pos)
        : engine_()
        , rotor_(engine_), tailRotor_(engine_)
        , ctrl_(engine_, rotor_, tailRotor_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        // пилот проверяет систему
        pilot.enable(ctrl_, HeliControlPanel::checkSystem); // throws system_error, если ошибка
        // запуск двигателя
        pilot.enable(ctrl_, HeliControlPanel::startEngine); // throws engine_fail, если отказ движка
        // ждем нужной скорости
        pilot.wait(ctrl_, HeliControlPanel::setEngineTakeoffMode); //включаем взлетный режим
        // тяга вверх,
        pilot.enable(ctrl_, HeliControlPanel::up); // throws flying_fail, если внезапное препятствие
        // режим полета
        pilot.enable(ctrl_, HeliControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboShaft engine_;
 
    Rotor     rotor_;
    TailRotor tailRotor_;
 
    HeliControlPanel ctrl_;
};
 
class Aeroplane
{
public:
    Aeroplane(Position const & pos)
        : leftEngine_(), rightEngine_()
        , ctrl_(leftEngine_, rightEngine_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        // пилот проверяет систему
        pilot.enable(ctrl_, JetControlPanel::checkSystem);
        // запуск двигателя
        pilot.enable(ctrl_, JetControlPanel::startEngine);
        // запуск двигателя
        pilot.enable(ctrl_, JetControlPanel::setEngineTakeoffMode);
        // разгон и ожидание набора нужной скорости
        pilot.wait(ctrl_, JetControlPanel::racing);
        // выпустить закрылки
        pilot.enable(ctrl_, JetControlPanel::releaseFlaps);
        // тяга вверх
        pilot.enable(ctrl_, JetControlPanel::up);
        // режим полета
        pilot.enable(ctrl_, JetControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboJet leftEngine_;
    TurboJet rightEngine_;
 
    JetControlPanel ctrl_;
};
 
// Теперь использование
int main()
{
    // здесь первая трудность, как этот список вернуть в одном массиве?
    // Можно выкрутиться, написав класс FlyingMachineHolder, пусть он хранит тип аппарата и указатель на него (void*)
 
    // некая функция, возвращает эскадрилью летательных аппаратов
    std::vector<FlyingMachineHolder> squadron = takeSquadron();
    // запустим их в воздух
    // для простоты не сажаю их непосредственно в машину, хотя можно было бы.
    // Только кода станет больше.
    for(size_t i = 0, size = squadron.size(); i < size; ++i)
    {
        Pilot & pilot = getFreePilot(); // получим свободного
 
        switch(squadron[i].type())
        {
        case M_HELICOPTER:
            // преобразование можно запихать в шаблон (без него будет еще хуже)
            // шаблоны ведь можно использовать? :)
            squadron[i].toConcreteMachine<Helicopter>()->tryToFly(pilot);
            break;
        case M_AERORPLANE:
            squadron[i].toConcreteMachine<Aeroplane>()->tryToFly(pilot);
            break;
        }
        pilot.busy(); // занят
    }
    // Если у нас таких аппаратов хотя бы 15 разных, то switch вырастет еще на 13 веток.
}

Модель упрощена, иначе придется реализовывать слишком много. Всего лишь демонстрация.
Это нужно учитывать.
Классы Pilot и характеристики внутренностей воздушных судов и т.д. не привожу, их реализация не влияет на идею.
Способы взлета вертолета и самолета разные. Алгоритм, который назначает машины к взлету не обязан знать про это. Так же как и диспетчеру все равно на какие конкретные кнопки нажимает пилот, главное чтобы он соблюдал нормы полета. Первый пример устойчив к расширению парка машин, второй - нет. Это основное и главное преимущество.
Код не компилируемый, предназначен для демонстрации идеи и все.
 
Текущее время: 00:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru