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

Иерархия. Наследование классов

01.05.2020, 14:26. Показов 18839. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня возникла ошибка в main.cpp, строка 12, пишет: "значение типа "cl_base*" нельзя использовать для инициализации сущности типа "cl_base2*" ". Не знаю как это исправить.

Само задание.

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

Создать базовый класс со следующими элементами:


Свойства:

- наименование объекта (строкового типа);
- указатель на головной объект для текущего объекта (для корневого объекта значение указателя равно 0);
- список указателей на объекты подчиненных к текущему объекту в дереве иерархии.

Функционал:
- параметризированный конструктор с параметром указателя на головной объект в дереве иерархии;
- параметризированный конструктор с параметром указателя на головной объект в дереве иерархии и наименованием объекта;
- метод задания имени объекта;
- метод получения имени объекта;
- метод вывода наименований объектов в дереве иерархии слева направо и сверху вниз.

Написать программу, которая последовательно строит дерево иерархии объектов, слева направо и сверху вниз. Переход на новый уровень происходит от правого (последнего) объекта предыдущего уровня. Для построения дерева использовать объекты двух производных классов, наследуемых от базового. Каждый объект имеет уникальное имя.

Построчно, по уровням вывести наименования объектов построенного иерархического дерева.

Входные данные

Первая строка:
«имя корневого объекта»
Создается корневой объект.
Вторая строка и последующие строки:
«имя головного объекта» «имя подчиненного объекта»
Создается подчиненный объект и добавляется в иерархическое дерево.

Если «имя головного объекта» равняется «имени подчиненного объекта», то новый объект не создается и построение дерева объектов завершается.

Пример ввода

Object_root
Object_root Object_1
Object_root Object_2
Object_root Object_3
Object_3 Object_4
Object_3 Object_5
Object_6 Object_6

Дерево объектов, которое будет построено по данному примеру:

Object_root
Object_1
Object_2
Object_3
Object_4
Object_5

Выходные данные

Первая строка:
«имя корневого объекта»
Вторая строка и последующие строки имена головного и подчиненных объектов очередного уровня разделенных двумя пробелами.
«имя головного объекта» «имя подчиненного объекта»[[ «имя подчиненного объекта»] …….]

Пример вывода

Object_root
Object_root Object_1 Object_2 Object_3
Object_3 Object_4 Object_5

Это код который я написал.

Osnova.h
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
#ifndef IRARH_H
#define IRARH_H
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class cl_base
{
private:
    string object_name;
    cl_base* p_parent;
public:
    cl_base(cl_base* p_parent, string s_object_name);
    cl_base(cl_base* p_parent);
    ~cl_base();
    void set_object_name(string s_object_name);
    string get_object_name();
    void showtree();
    vector <cl_base* > children;
    vector <cl_base* >::iterator it_child;
};
 
class cl_base1 :public cl_base
{
public:
    using cl_base::cl_base;
};
class cl_base2 :public cl_base
{
public:
    using cl_base::cl_base;
};
 
#endif
Osnova.cpp
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
#include <iostream>
#include "Osnova.h"
using namespace std;
 
 
cl_base::cl_base(cl_base* p_parent, string s_object_name)
{
    set_object_name(s_object_name);
    this->p_parent = p_parent;
    if (this->p_parent != 0)
        this->p_parent->children.push_back(this);
}
 
cl_base::cl_base(cl_base* p_parent)
{
    this->p_parent = p_parent;
}
 
cl_base::~cl_base()
{
    for (int i = 0; i < this->children.size(); i++)
    {
        delete this->children[i];
    }
}
 
void cl_base::set_object_name(string s_object_name)
{
    object_name = s_object_name;
}
 
string cl_base::get_object_name()
{
    return object_name;
}
 
void cl_base::showtree()
{
    cout << this->get_object_name();
    for (int i = 0; i < this->children.size(); i++) {
        cout << " " << this->children[i]->get_object_name();
    }
    for (int i = 0; i < this->children.size(); i++) {
        if (this->children[i]->children.size() != 0) {
            cout << endl;
            children[i]->showtree();
        }
    }
}
main.cpp
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
#include <iostream>
#include <string>
#include "Osnova.h"
 
using namespace std;
 
int main()
{
    string root, parent, name;
    cin >> root;
    cl_base* ob_root = new cl_base(0, root);
    cl_base2* ob = ob_root;
    cl_base2* temp = 0;
    for (int i = 0; ; i++)
    {
        cin >> parent >> name;
        if (parent == name)
            break;
        if (i != 0 && ob->get_object_name() != parent)
            ob = temp;
        temp = new cl_base2(ob, name);
    }
    cout << ob_root->get_object_name() << endl;
    ob_root->showtree();
    delete ob_root;
    delete temp;
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2020, 14:26
Ответы с готовыми решениями:

Множественное наследование. Иерархия классов
Создать классы фигура, четырехугольник, квадрат и прямоугольник. Создать из них иерархию. Определить функции печати, конструкторы и...

Задача на множественное наследование, иерархия классов
Создать класс хвост, имеющий в качестве параметров длину и вид(строка). Определить конструкторы и метод доступа. Создать класс хвостатое...

Иерархия классов, наследование (Млекопитающие, Парнокопытные, Птицы, Животное)
нужно создать иерархию класcов с механизмом наследования написать код я хочу написать сам , но основная проблем в том что с биологией...

2
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:05
Лучший ответ Сообщение было отмечено Astreemonter как решение

Решение

Цитата Сообщение от Astreemonter Посмотреть сообщение
У меня возникла ошибка в main.cpp, строка 12, пишет: "значение типа "cl_base*" нельзя использовать для инициализации сущности типа "cl_base2*" ". Не знаю как это исправить.
Надо преобразовывать от потомка к предку, а не наоборот
C++
1
2
cl_base2* ob = new cl_base2(0, root);
cl_base* ob_root = ob;
1
0 / 0 / 0
Регистрация: 21.11.2021
Сообщений: 2
21.11.2021, 22:13
Почему то выдаёт free():˽double˽free˽detected˽in˽tcache˽2 ↵
Aborted˽(core˽dumped)↵
Помогите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2021, 22:13
Помогаю со студенческими работами здесь

Абстрактный базовый класс и множественное наследование (либо иерархия классов)
Помогите пожалуйста с задачей. Кое-что написал но еще далеко не все. Все ли пока правильно? Мобильные телефоны (наименование,...

Одиночное наследование, иерархия классов "Шахматная фигура"
Люди добрые помогите пожалуйста написать программу на с++. Создать иерархию классов шахматная фигура - абстрактный класс, содержащий...

Наследование, иерархия, коллекция, декомпозиция
Суть предельно проста: декомпозиция объектов; объект класса base содежит имя(char name) и указатель на двунаправленный список указателей...

Автоматическая генерация классов С ++ с UML диаграмм классов. Наследование в с++. Абстрактные классы. WhiteStarUML
Создать классовую модель(желательно в WhiteStarUML), которая включает в себя абстрактный класс CGraphicsObject, его наследник - базовый...

Иерархия графических компонентов - нужно ли наследование?
Это мой вариант задания: Иерархия графических компонентов. Имеется набор компонетов: окно, надпись, список, кнопка, панель, линия....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru