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

Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Составить метод Run для вычисления выражения: http://www.cyberforum.ru/cpp-beginners/thread1029255.html
Составить метод Run для вычисления выражения:
C++ Написать программу обработки файла типа запись, содержащую следующие пункты меню: Различные цеха завода выпускают продукцию нескольких наиме¬нований. Сведения о выпущенной продукции включают: - наименование; - количество; - номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества. http://www.cyberforum.ru/cpp-beginners/thread1029254.html
Разница в днях C++
Найти разницу в днях между двумя заданными датами. Даты вводить с клавиатуры.
Найти ошибку кода(если есть) C++
Подскажите,пожалуйста,есть ли в данном коде ошибка и какая: Определите ошибку (если есть): double sum (int x = 0, int y) { int z; z = x + y; return z; } я подумал сразу,что разные типа данных(double и int)будет несовместимость,но оказалось неправильно
C++ ООП перегрузка операторов сумма элементов http://www.cyberforum.ru/cpp-beginners/thread1029229.html
есть задача, нужно изменить перегрузку операции "+". что бы возвращало значение суммы двух входящих Векторов (массивов). HELP #include <iostream> #include <windows.h> using namespace std; const int vector_size = 8; // размер вектора class vector { // базовый класс
C++ Односвязный список Задание: Сформировать список вещественных чисел и вычислить сумму. На 32 строке где значения, выдает ошибку. Почему? Сумму этих чисел нужно описывать через функцию? Подскажите каким образом это сделать. Не понимаю я эту тему. Поэтому все что написано ниже может быть полной ерундой:-#include <iostream> #include <conio.h> using namespace std; подробнее

Показать сообщение отдельно
Poplavskiy S
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 10
05.12.2013, 03:58     Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <stdlib.h>
 using namespace std;
//Объявляем базовый класс
class X 
{
    // раздел того, что будет доступно детям, но невидно извне.
    protected:
        int *x1, *x2; // 2 поля с динамическим хранением
 
    // раздел того, что доступно всем, в т.ч. извне.
    public:
      
        // конструктор с параметрами, обычная инициализация
        X(int a, int b)
        {
            // просим память под переменные
            x1 = new int;
            x2 = new int;
            // записываем в них собсно значения
            *x1 = a;
            *x2 = b;
        }
        
        // виртуальная функция просмотра текущего состояния базового класса
        virtual void view()
        {
            cout << "x1=" << *x1 << " x2=" << *x2 << endl;
        }
        
        // виртуальная функция установки состояния базового класса в новое значение
        virtual void set_new()
        {
            // читаем новые значения х1, х2 с консоли
            cout << "Input x1: ";
            cin >> *x1;
            cout << "Input x2: ";
            cin >> *x2;
        }
             
        // деструктор базового класса
        ~X()
        {
            // старательно чистим память, которую просили в конструкторе
            delete x1;
            delete x2;
        }
};
 
// производный класс У, унаследованный от Х.
class Y:public X
{
    private:
        int *y; //аналогично, тока раз детей у класса У не будет, спрячем поле как прайвет.
        
    public:
        
        // конструктор с инициализацией списком.
        Y(int a, int b, int c):X(a,b) // вот тут дернули конструктор базового класса Х(a,b) передав туда параметры - чтобы записалось х1, х2
        {
            // уже знакомым способом просим память и заполняем значением новую переменную этого класса
            y = new int;
            *y = c;
        }
        
        // переопределенный метод просмотра текущего состояния объекта. Поля-то у нас 3 теперь, надо выводить их все.
        virtual void view()
        {
            // х1, х2 тут доступны, т.к. они protected в Х, а значит унаследовались от базового класса.
            cout << "x1=" << *x1 << " x2=" << *x2 << " y=" << *y << endl;
        }
        
        // переопределенный метод установки нового значения. Опять-таки, поля у нас аж 3, и снова х1, х2 видны тут.
        virtual void set_new()
        {
            cout << "Input x1: ";
            cin >> *x1;
            cout << "Input x2: ";
            cin >> *x2;
            cout << "Input y: ";
            cin >> *y;
        }
        
        // деструктор класса У. в нем очищаем память, которую просили в конструкторе.
        ~Y()
        {
            delete y;
        }
        
        // собсно, метод что-то вычисляющий и выводящий значение на консоль.
        void Run()
        {
            cout << "Res: " << ( *x1 - *x2 ) / *y << endl;
        }
};
 
void main()
{
    X *t; // объявили указатель на базовый класс.
    t = new X(10,20); // создали новый объект Х[х1=10, х2=20]
    t->view(); // дернули у объекта метод просмотра. Получим "х1=10 х2=20"
    t->set_new(); // запишем в него чет новое, вызвав метод установки новых значений.
    t->view(); // дернули опять просмотр. Получим то, что ввели на предыдущем шаге.
    
    delete t; // удалим объект класса Х, тут у него дернулся дестркутор ~X(), и память освободилась
    
    t = new Y(100, 50, 2); // создадим экземпляр класса У[x1=100, x2=50, y=2], но указывать на него будет все тот же указатель.
    t->view(); //дернули у него метод просмотра. Вот тут сработала виртуализация, и мы получили не "х1=100 х2=50" а "х1=100 х2=50 у=2"
    t->set_new(); // аналогичным образом простаавим новые значения. сработает виртуализация, и нас спросят не про 2 параметра, а уже про 3.
    t->view(); // посмотрим, что же мы там ввели в этот игрэк.
    
    // танцы с бубном: просто вызвать метод Run() типа так: t->Run(); мы не можем, т.к. у класса Х этого метода нет, 
    // он есть только у класса Y. Поэтому сначала преобразуем тип указателя к типу Y* сделав ((Y*) t), 
    // а потом у уже полученного таким образом указателя Y* вызовем метод Run(). 
    // А если бы было:
    // Y* p = new Y(1,2,3);
    // то можно бы было вызвать сразу
    // p->Run();
    ((Y*) t)->Run();    
    
    delete t; // удаляем объект класса У - тут дернеться деструктор сначала "~Y()" а затем "~X()"
}
Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru