Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/47: Рейтинг темы: голосов - 47, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227

Добавление объектов классов в односвязный список путем вызова методов этих классов

09.11.2020, 20:59. Показов 9002. Ответов 13

Студворк — интернет-сервис помощи студентам
Все ломаю голову как решить эту задачу. Есть несколько классов. Один абстрактный, остальные производные. Нужно написать односвязный список. В списке должны быть функции добавления элемента и просмотр списка. Для каждого производного класса нужно определить свои функции добавления и просмотра. У меня класс list написан при помощи шаблона, чтобы объекты разных классов принимал. При этом я туда закидываю ссылку на объект this. Я не могу просто взять и создать один объект класса list, а туда уже добавлять элементы, т.к. опять же используется шаблон и при создании необходимо указать аргумент типа, который у разных классов разнится. Создавая несколько объектов у меня просто создается несколько (штук 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
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
#include <conio.h>
using namespace std;
 
class Good
{
 
protected:
 
    template <typename T>
 
    class list
    {
        struct Node
        {
            T a;
            Node* next;
        };
 
        Node* head = nullptr;
 
        friend class Product;
        friend class Good;
        friend class MilkProduct;
        friend class Toy;
 
    public:
 
        void AddElementAtfront(T* x)
        {
            if (head == nullptr)
            {
                Node* current = new Node;
                current->a = *x;
                current->next = nullptr;
                head = current;
            }
            else
            {
                Node* current = new Node;
                current->a = *x;
                current->next = nullptr;
                head->next = current;
            }
        }
 
        void print()
        {
            Node* current = head;
            while (current != nullptr)
            {
                cout << &(current->a) << " --> ";
                current = current->next;
            }
 
            cout << "NULL" << endl;
        }
 
    };
 
public:
 
    virtual void listAdd() = 0;
 
    virtual void listPrint() = 0;
 
};
 
class Product : public Good
{
 
    list<Product> obj;
 
public:
 
    void listAdd()
    {
        obj.AddElementAtfront(this);
    }
 
    void listPrint()
    {
        obj.print();
    }
};
 
class MilkProduct : public Product
{
 
    list<MilkProduct> obj;
 
public:
 
    void listAdd()
    {
        obj.AddElementAtfront(this);
    }
 
    void listPrint()
    {
        obj.print();
    }
};
 
class Toy : public Good
{
 
    list<Toy> obj;
 
public:
 
    void listAdd()
    {
        obj.AddElementAtfront(this);
    }
 
    void listPrint()
    {
        obj.print();
    }
};
 
 
int main()
{
    setlocale(LC_ALL, "ru");
 
    Product cheese;
    cheese.listAdd();
    cheese.listPrint();
    MilkProduct milk;
    milk.listAdd();
    milk.listPrint();
    Toy bear;
    bear.listAdd();
    bear.listPrint();
 
    _getch();
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2020, 20:59
Ответы с готовыми решениями:

Распечатать односвязный список классов
создал несколько классов так :первый класс абстактный втрой унаследывает от первого, третий от второго в первом класе есть функция...

Односвязный список (реализация без классов)
Задача проста: создать список из слов, вводимых с клавиатуры, и вывести его на консоль. Всё вводит и выводит. Только откуда-то взялась...

Массив разных классов. Как добратся до всех полей этих классов?
Все классы имеют общего предка. Экземпляры этих классов запихнуты в один массив нужно както добраться до полей и методов которые...

13
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.11.2020, 21:42
KaffLime, может так?
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
#include <iostream>
#include <list>
#include <memory>
 
class Good
{
public:
    virtual ~Good() = default;
    virtual void show() const = 0;
};
 
class Product : public Good
{
public:
    void show() const override { std::cout << "Product "; }
};
 
class MilkProduct : public Product
{
public:
    void show() const override{ Product::show(); std::cout << "Milk "; }
};
 
class Toy : public Good
{
public:
    void show() const override { std::cout << "Toy "; }
};
 
typedef std::unique_ptr<Good> PGood;
 
int main()
{
    std::list<PGood> goods;
    goods.push_back(PGood(new MilkProduct));
    goods.push_back(PGood(new Toy));
    goods.push_back(PGood(new Product));
    for (PGood const & g : goods)
    {
        g->show();
        std::cout << '\n';
    }
}
0
 Аватар для Recrut_rf
388 / 333 / 65
Регистрация: 14.10.2014
Сообщений: 1,437
09.11.2020, 21:46
zayats80888, А может он хотел замутить свой список? Только нафига его внутрь классов втыкать?

KaffLime, Что мешает сделать свой шаблонный класс список отдельно от других классов? Ну то есть не определять их внутри каждого класса, а написать отдельно шаблонный класс и потом использовать в других своих классах экземпляры этого шаблонного класса?
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
09.11.2020, 22:09  [ТС]
Recrut_rf, без разницы, вывод один и тот же. Уже пробовал )
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.11.2020, 22:12
Цитата Сообщение от Recrut_rf Посмотреть сообщение
А может он хотел замутить свой список?
Ну и в чем проблема подставить свой список вместо std::list?
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
09.11.2020, 22:29  [ТС]
zayats80888, хм, может и подойдет. А что это за чудеса?

C++
1
2
typedef std::unique_ptr<Good> PGood;
std::list<PGood> goods;
Добавлено через 10 минут
Хотя наверное нет... Объекты классов не создаются в качестве отдельных элементов и функция вывода списка определена не так, как мне нужно. Прикол в том, чтобы вызывать в любом классе функцию вывода списка

Ну и добавления
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.11.2020, 22:52
Цитата Сообщение от KaffLime Посмотреть сообщение
Прикол в том, чтобы вызывать в любом классе функцию вывода списка
Вывода списка чего? Это какой то бред, перепечатай задание, слово в слово, без отсебятины.
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
09.11.2020, 23:06  [ТС]
zayats80888

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

Порядок выполнения работы.
1. Определить иерархию классов (в соответствии с вариантом).
2. Определить в классе статическую компоненту - указатель на
начало связанного списка объектов и статическую функцию для
просмотра списка.
3. Реализовать классы.
4. Написать демонстрационную программу, в которой создаются
объекты различных классов и помещаются в список, после чего список
просматривается.
5. Сделать соответствующие методы не виртуальными и
посмотреть, что будет.
6. Реализовать вариант, когда объект добавляется в список
при создании, т.е. в конструкторе (смотри пункт 6 следующего
раздела).
Методические указания.
1. Для определения иерархии классов связать отношением
наследования классы, приведенные в приложении (для заданного
варианта). Из перечисленных классов выбрать один, который будет
стоять во главе иерархии. Это абстрактный класс.
2. Определить в классах все необходимые конструкторы и
деструктор.
3. Компонентные данные класса специфицировать как protected.
4. Пример определения статических компонентов:
static person* begin; // указатель на начало списка
static void print(void); // просмотр списка
5. Статическую компоненту-данное инициализировать вне
определения класса, в глобальной области.
6. Для добавления объекта в список предусмотреть метод
класса, т.е. объект сам добавляет себя в список. Например, a.Add()
− объект a добавляет себя в список.
Включение объекта в список можно выполнять при создании
объекта, т.е. поместить операторы включения в конструктор. В
случае иерархии классов, включение объекта в список должен

выполнять только конструктор базового класса. Вы должны
продемонстрировать оба этих способа.
7. Список просматривать путем вызова виртуального метода
Show каждого объекта.
8. Статический метод просмотра списка вызывать не через
объект, а через класс.
9. Определение классов, их реализацию, демонстрационную
программу поместить в отдельные файлы.
Содержание отчета.
1. Титульный лист: название дисциплины; номер и наименование
работы; фамилия, имя, отчество студента; дата выполнения.
2. Постановка задачи. Следует дать конкретную постановку,
т.е. указать, какие классы должны быть реализованы, какие должны
быть в них конструкторы, компоненты-функции и т.д.
3. Иерархия классов в виде графа.
4. Определение пользовательских классов с комментариями.
5. Реализация конструкторов с параметрами и деструктора.
6. Реализация методов для добавления объектов в список.
7. Реализация методов для просмотра списка.
8. Листинг демонстрационной программы.
9. Объяснение необходимости виртуальных функций. Следует
показать, какие результаты будут в случае виртуальных и не
виртуальных функций.

9) игрушка, продукт, товар, молочный продукт;
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.11.2020, 23:22
Лучший ответ Сообщение было отмечено KaffLime как решение

Решение

KaffLime, то ещё извращение. Как то так, свой указатель на список сам реализуй.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <list>
 
class Good
{
public:
    Good() { add(this); }
    virtual ~Good() {};
    virtual void show() const = 0;
 
    static void add(Good* g) { goods.push_back(g); }
    static void showList() { for (auto g : goods) g->show(); }
    
private:
    static std::list<Good*> goods;
};
 
class Product : public Good
{
public:
    void show() const override { std::cout << "Product\n"; }
};
 
class MilkProduct : public Product
{
public:
    void show() const override { std::cout << "Milk\n"; }
};
 
class Toy : public Good
{
public:
    void show() const override { std::cout << "Toy\n"; }
};
 
std::list<Good*> Good::goods;
 
int main()
{
    MilkProduct g1;
    Product g2;
    Toy g3;
    Good::showList();
}
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
10.11.2020, 00:12  [ТС]
zayats80888, ну, здесь далеко не только указатель написать, но спасибо за помощь.

Добавлено через 14 минут
zayats80888, только ответьте ещё на один вопрос, пожалуйста. Тут в список goods заносятся объекты/указатели на объекты, кроме класса Good? Хочу в конструкторах производных классов добавление сделать. Если я просто функцию add для них перепишу, получится бред?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.11.2020, 00:24
Цитата Сообщение от KaffLime Посмотреть сообщение
Тут в список goods заносятся объекты/указатели на объекты, кроме класса Good?
Только указатели на Good.
Цитата Сообщение от KaffLime Посмотреть сообщение
Если я просто функцию add для них перепишу, получится бред?
Это не нужно. Этого даже не требуется в бредовом задании. Функция add доступна вообще всем.
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
10.11.2020, 00:49  [ТС]
zayats80888, тут написано, что необходимо два варианта продемонстрировать...


... 6. Для добавления объекта в список предусмотреть метод
класса, т.е. объект сам добавляет себя в список. Например, a.Add()
− объект a добавляет себя в список.
Включение объекта в список можно выполнять при создании
объекта, т.е. поместить операторы включения в конструктор. В
случае иерархии классов, включение объекта в список должен

выполнять только конструктор базового класса. Вы должны
продемонстрировать оба этих способа.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.11.2020, 00:54
KaffLime, ну допустим , вариант без автодобавления:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class Good
{
public:
    Good() : next(nullptr) {}
    virtual ~Good() { /*что бы не отстрелить ногу, убрать все вхождения this в список*/ };
    virtual void show() const = 0;
 
    void add() { add(this); }
    static void showList() { for (Good* ptr = begin; ptr; ptr = ptr->next) ptr->show(); }
 
protected: // нафига в задании protected?
    static void add(Good* g) { g->next = begin; begin = g; }
    static Good* begin;
private:
    Good* next;
};
 
Good* Good::begin = nullptr;
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 227
10.11.2020, 01:07  [ТС]
zayats80888, не, этого я уже не пойму. Может сам чего придумаю потом, спасибо еще раз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2020, 01:07
Помогаю со студенческими работами здесь

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов)
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как вынести методы из классов Panel и...

Реализовать иерархию классов, включающую в себя односвязный и двусвязный список
Нужно реализовать иерархию классов, включающую в себя односвязный и двусвязный список. При компиляции программа выдает ошибку:&quot;Ошибка...

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение, демонстрирующее работу с коллекцией объектов...

Преобразования объектов классов в объекты других классов
Задача типа обмен валют. Нужно конвертировать старый фунт стерлинг(фунт, шиллинг и пенсы) в доллары и обратно, по курсу 1 фунт = 50...

Подскажите где можно взять список пакетов методов и классов lwjg
Доброго времени суток. Подскажите где можно взять список пакетов методов и классов lwjg, типа того что дается oracle к java se, спасибо,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru