Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 13.06.2017
Сообщений: 20
1

Вывод массива объектов дочерних классов

03.12.2020, 12:03. Показов 745. Ответов 6

Author24 — интернет-сервис помощи студентам
У меня есть один базовый класс и три дочерних
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
class Printer
{
private:
    string name;
    double speed;
    double price;
 
public:
    Printer(string c_name = "No name", double c_speed = 0, double c_price = 0)
    {
        name = c_name;
        speed = c_speed;
        price = c_price;
    }
 
    Printer(Printer* printer)
    {
        name = printer->name;
        speed = printer->speed;
        price = printer->price;
    }
 
    ~Printer()
    {}
virtual void Print()
{
cout << name << " " << price << " " << speed;
    }
};
 
class MatrixPrinter : public Printer
{
private: int memory;
 
public:
    MatrixPrinter(string name = "No name", double speed = 0, double price = 0, int c_memory = 0) : Printer(name, speed, price)
    {
        memory = c_memory;
    }
 
    MatrixPrinter(MatrixPrinter& mPrinter) : Printer(mPrinter)
    {
        memory = mPrinter.memory;
    }
 
    ~MatrixPrinter() {}
 
    void Print() override
    {
        Printer::Print();
        cout << memory;
    }
};
 
class LaserPrinter : public Printer
{
private: int noiseLevel;
 
public:
    LaserPrinter(string name = "No Name", double speed = 0, double price = 0, int c_noise = 0) : Printer(name, speed, price)
    {
        
        noiseLevel = c_noise;
    }
 
    LaserPrinter(LaserPrinter& lPrinter) : Printer(lPrinter)
    {
        noiseLevel = lPrinter.noiseLevel;
    }
 
    ~LaserPrinter() {}
 
    void Print() override
    {
        Printer::Print(this);
        cout << noiseLevel;
    }
};
 
class InkjetPrinter : public Printer
{
private: bool color;
 
public:
    InkjetPrinter(string name = "No Name", double speed = 0, double price = 0, bool c_color = false) : Printer(name, speed, price)
    {
        color = c_color;
    }
 
    InkjetPrinter(InkjetPrinter& iPrinter) : Printer(iPrinter)
    {
        color = iPrinter.color;
    }
 
    ~InkjetPrinter() {}
 
    void Print() override
    {
        Printer::Print();
        cout << color;
    }
};
В основном коде я создаю массив

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
void choosePriterType(Printer& printer, string& name, double& speed, double& price, int& meNoi, bool& color)
{
    cout << "\nChoose type of printer:\n";
    cout << "1. Matrix Printer\n";
    cout << "2. Laser Printer\n";
    cout << "3. Inkjet Printer\n";
 
    int line;
 
    cin >> line;
 
    switch (line)
    {
    case 1:
        newPrinter(1, name, speed, price, meNoi);
        printer = MatrixPrinter(name, speed, price, meNoi);
        break;
    case 2:
        newPrinter(2, name, speed, price, meNoi);
        printer = LaserPrinter(name, speed, price, meNoi);
        break;
    case 3:
        newPrinter(3, name, speed, price, color);
        printer = InkjetPrinter(name, speed, price, color);
        break;
    }
}
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
void newPrinter(int type, string name, double speed, double price, int memNoi, bool color)
{
    cout << "\nEnter Printer Name\n";
    cin >> name;
    cout << "Enter Printer Speed\n";
    cin >> speed;
    cout << "Enter Printer Price\n";
    cin >> price;
    if (type == 1)
    {
        cout << "Enter Printer Memory\n";
        cin >> memNoi;
    }
    if (type == 2)
    {
        cout << "Enter Noise Level\n";
        cin >> memNoi;
    }
    if (type == 3)
    {
        cout << "Enter color function (y/n)\n";
        string t;
        cin >> t;
        if (t._Equal("y"))
            color = true;
        else
            color = false;
    }
}
Таким образом я пыталась сделать вывод, но он обращается к методу базового класса
C++
1
2
3
4
5
if (l == 0)
                cout << "\nNo one printer in a base\n\n";
            else
                for (int i = 0; i < l; i++)
                    printer[i].Print();
Может у меня в принципе сам принцип не верен. Прошу подсказать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2020, 12:03
Ответы с готовыми решениями:

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в...

Создание динамического массива объектов разных классов
У меня есть класс Car и 3 класса Buss, Truck, Passenger которые наследуют класс Car. Как создать...

Ошибка при создании двумерного массива из объектов производных классов
Доброго времени суток. Для начала обрисую ситуацию. Мне нужно динамически создать двумерный массив...

Создание объектов дочерних классов
Допустим у меня есть класс Parent. И есть дочерние классы ChildA, ChildB, ChildC. Есть функция в...

6
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
03.12.2020, 12:14 2
Цитата Сообщение от Daha-Doom Посмотреть сообщение
Может у меня в принципе сам принцип не верен. Прошу подсказать
Каждый класс напрямую должен заниматься только своими компонентами. То есть печатать надо "свое", а то, что унаследовано. делегировать на печать соответствующим базовым классам. Так же и с другими аспектами поведения, не только с печатью.
1
0 / 0 / 0
Регистрация: 13.06.2017
Сообщений: 20
03.12.2020, 12:40  [ТС] 3
Так вроде у меня печать объектов базового класса в базовом, а дочерних в дочерних
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
03.12.2020, 12:44 4
Daha-Doom, механизм вызова виртуальных функций работает только через указатели или ссылки.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.12.2020, 12:55 5
Цитата Сообщение от Daha-Doom Посмотреть сообщение
Может у меня в принципе сам принцип не верен. Прошу подсказать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::unique_ptr<Printer> choosePriterType(string& name, double& speed, double& price, int& meNoi, bool& color)
{
    cout << "\nChoose type of printer:\n";
    cout << "1. Matrix Printer\n";
    cout << "2. Laser Printer\n";
    cout << "3. Inkjet Printer\n";
 
    int line;
 
    cin >> line;
 
    switch (line)
    {
    case 1:
        newPrinter(1, name, speed, price, meNoi);
        return std::make_unique<MatrixPrinter>(name, speed, price, meNoi);
    case 2:
        newPrinter(2, name, speed, price, meNoi);
        return std::make_unique<LaserPrinter>(name, speed, price, meNoi);
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
03.12.2020, 13:20 6
Цитата Сообщение от Daha-Doom Посмотреть сообщение
Так вроде у меня печать объектов базового класса в базовом, а дочерних в дочерних
Значит этот аспект ООП ты понимаешь верно ))
0
0 / 0 / 0
Регистрация: 13.06.2017
Сообщений: 20
18.12.2020, 09:33  [ТС] 7
Вот ответ. Нужно создать массив указателей
C++
1
Printer** printer = new Printer*[lenght];
Метод вывода сделать виртуальным
C++
1
2
3
4
virtual void Print()
    {
        cout << "Name: " << name << "\tPrice: " << price << "\tSpeed: " << speed;
    }
C++
1
2
3
4
5
void Print() override
    {
        Printer::Print();
        cout << "\tMemory: " << memory << endl;
    }
И делаем вывод
C++
1
2
3
4
5
6
7
8
9
if (l == 0)
                cout << "\nNo one printer in a base\n\n";
            else
                for (int i = 0; i < l; i++)
                {
                    cout << i << "\t";
                    printer[i]->Print();
                }
            cout << endl;
0
18.12.2020, 09:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2020, 09:33
Помогаю со студенческими работами здесь

Определение классов, описание экземпляров классов (объектов). Уровни доступа к членам классов
Разработать класс, моделирующий предметной области, описание которой приведено в Вашему варианте....

Программирование на С++ с использованием массива классов (объектов)
Создать класс четырехугольник, члены класса – координаты 4-х точек. Предусмотреть в классе методы...

Реализовать вывод массива объектов типа Student на консоль (файловый ввод/вывод)
Как сделать чтобы список студентов выводился на экран в конце? #include&lt;iostream&gt; ...

Десериализация дочерних классов
Доброго дня. Получаю от сервера Xml вида &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;QueryResult ...

Несколько дочерних классов
Господа форумчане, подскажите как можно сделать наследование от одного класса нескольких, но так,...

DataContract для дочерних классов
Есть два класса. При выполнении программы пишется: не удалось сюрелиозавать класс ChtaUser. Я так...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru