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

Создание узла дерева в который можно впихнуть любой объект

07.11.2020, 02:00. Показов 1412. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть реализация разных деревьев. По заданию мне надо строить дерево из объектов что угодно(int, string, vecrot) книга, персонаж. Я это реализовал так, что каждый из этих классов это узел дерева. Но преподаватель сказал, что это неправильно. Надо эти объекты засовывать в узел и так строить дерево. Я пытался переделать, но запутался в шаблонам и мне кажется, что делаю как-то не так. Не могли бы мне помочь и исправить в моем проекте?

Добавлено через 37 секунд
http://github.com/LavrovSergey/OOP
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2020, 02:00
Ответы с готовыми решениями:

Есть ссылка на объект. Можно ли изменить объект, который хранится по этому адресу?
Есть ссылка на объект. Можно ли изменить объект, который хранится по этому адресу? Т.е. не меняя саму ссылку, изменить тип объекта, на...

Как реализовать метод, который превратит любой объект в byte[] ?
public static byte GetByte(object obj) { byte ret=null; //---------------------------Вот что делать с объектом? ...

Создать объект, который мог бы принимать в себя любой тип данных
Object ten = 10; Object str = "string"; Такая запись обязательна. То есть тип данных должен быть определен в шаблоне конструктора (я...

15
 Аватар для Annemesski
2681 / 1341 / 482
Регистрация: 08.11.2016
Сообщений: 3,707
08.11.2020, 00:13
Полагаю что преподаватель хочет от Вас простой шаблонной реализации бинарного дерева, что-то вроде
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
template<class T>
struct TreeNode
{
    T data;
    TreeNode *left, *right;
    TreeNode(void) : left(nullptr), right(nullptr) { }
    TreeNode(const T &val) : TreeNode() { data = val; }
 
    friend bool operator>(const TreeNode &first, const TreeNode &second) { return first > second ? true : false; }
    friend bool operator>=(const TreeNode &first, const TreeNode &second) { return first >= second ? true : false; }
    friend bool operator<(const TreeNode &first, const TreeNode &second) { return first < second ? true : false; }
    friend bool operator<=(const TreeNode &first, const TreeNode &second) { return first <= second ? true : false; }
    friend bool operator==(const TreeNode &first, const TreeNode &second) { return first == second ? true : false; }
};
 
template<class T>
class Tree
{
    TreeNode<T> *head;
public:
    Tree(void) : head(nullptr) { }
    Tree(const Tree &other);
    Tree(const Tree &&other);
    Tree & operator=(const Tree &other);
    Tree & operator=(const Tree &&other);
    ~Tree(void);
 
    TreeNode<T> * find(const T &val) const;
    void add(const T &val);
    void del(const T &val);
 
private:
    TreeNode<T> * mFindNode(const T &val, const TreeNode<T> *root, TreeNode<T> **candidate = nullptr) const;
};
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
08.11.2020, 00:17  [ТС]
Annemesski, ну да дерево должно быть шаблонным. Не могли б вы рассмотреть именно мой пример. Вообще то что у вас в дереве дата у меня должно быть классом книги, персонажа и тд. И именно тут я запнулся. Я запутался в шаблонах, не понимаю как мне потом обращаться к элементам моего объекта
0
 Аватар для Annemesski
2681 / 1341 / 482
Регистрация: 08.11.2016
Сообщений: 3,707
08.11.2020, 00:48
БесподобeH, решительно не важно какой тип данных Вы будет помещать в дерево, лишь одно правило: для каждого типа данных свое дерево, просто в майне инстанцируете шаблон
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
#include "Tree.h" // класс дерево
#include "Book.h" // класс книга
#include "Character.h" // класс персонаж
 
class foo
{
    int data;
public:
    foo(void) : data(100) { }
    void set(int val) { data = val; }
    int get(void) const { return data; }
};
 
class bar
{
    double data;
public:
    foo(void) : data(0.01) { }
    void set(double val) { data = val; }
    int get(void) const { return data; }
};
 
int main()
{
    Tree<int> intTree;
    intTree.add(1);
    intTree.add(2);
    intTree.add(3);
 
    Tree<double> doubleTree;
    doubleTree.add(0.1);
    doubleTree.add(0.2);
    doubleTree.add(0.3);
 
    Tree<bar> barTree;
    barTree.add(bar);
    barTree.add(bar(0.02));
    barTree.add(bar(0.03));
 
    Tree<foo> fooTree;
    fooTree.add(foo);
    fooTree.add(foo(200));
    fooTree.add(foo(300));
 
    Tree<Character> characterTree;
    characterTree.add(Character);
 
    Tree<Book> bookTree;
    bookTree.add(Book);
 
    return 0;
}
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
08.11.2020, 01:05  [ТС]
Annemesski, пожалуйста вот укороченая версия моей лабы покажите на най пж. Я уже устал от нее. https://github.com/LavrovSergey/test
0
 Аватар для Annemesski
2681 / 1341 / 482
Регистрация: 08.11.2016
Сообщений: 3,707
08.11.2020, 01:17
БесподобeH, шутите? Предлагаете мне разобрать Ваши 600+ строк кода и подогнать под Ваше задание? После такого замуж зовут, а я еще и не девушка. Серьезно, уж куда проще Вам будет взять предложенную заготовку и дописать недостающее, там всего-то и надо 1,5 конструктора и 3,5 метода реализовать.
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
08.11.2020, 01:20  [ТС]
Annemesski, я не прошу все переделывать. А просто хоть что то исправить, указать и дальше я все сам сделаю

Добавлено через 1 минуту
Annemesski,Давайте хотя бы на этом разберемся. На ptr->id выдает что в Node такого нет. Это понято. Но если мы сделаем ptr->data->id(поскольку ptr указывает на узел, а дата это объект который мы туда засунули) тоже выдаст ошибку

C++
1
2
3
4
5
6
7
8
template< class T, class U>
class Node {
friend class BinarySearchTree<T, Node>;
public:
Node* left;
Node* right;
U data;
};
C++
1
2
3
4
5
6
7
class Part1 {
public:
T data;
std::vector v;
int id = 0;
bool way;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Find(int a) {
T inf;
cout << "Введите, что хотите найти" << endl;
cin >> inf;
if (a == 1)
{
U* ptr = FindPrivate1(inf, BinarySearchTree::root);
if (ptr == NULL) { cout << "Такого нема" << endl; }
else(cout << ptr->id << ". " << ptr->data << endl);
system("pause");
}
}
0
 Аватар для Annemesski
2681 / 1341 / 482
Регистрация: 08.11.2016
Сообщений: 3,707
08.11.2020, 01:33
БесподобeH, Вы хоть понимаете что эти Ваши T inf и U *ptr в приведенном контексте не значат ровным счетом ничего? Понимаете что дабы они имели хоть какой-то смысл нужно инстанцировать шаблон класса? Понимаете что значит инстанцировать? Еще раз говорю разбирать то что Вы предлагаете - особый вид извращения, а Вы еще и на ночь глядя эту парнуху глядеть предлагаете... нет, на этом мои полномочия всё.
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
08.11.2020, 01:40  [ТС]
Annemesski, ну я пытаюсь разобраться поэтому и ищу помощь

Добавлено через 2 минуты
Annemesski, слово инстанциировать не знал, но как понял это указать что именно там будет? Т- это int, string double, а U-это объект(книга, персонаж), который вставляется

Добавлено через 2 минуты
Annemesski, до этого в U я засовывл эти объекты, но они были как узел(тоесть там были указатели на лево, право и информация например по книге), но сказали, что так неправильно и надо разделить их. И я пытаюсь понять как это правильно делать и как обращаться к элементам объекта, который мы засунули в Node data
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.11.2020, 01:58
Лучший ответ Сообщение было отмечено БесподобeH как решение

Решение

Цитата Сообщение от БесподобeH Посмотреть сообщение
Но если мы сделаем ptr->data->id(поскольку ptr указывает на узел, а дата это объект который мы туда засунули) тоже выдаст ошибку
Потому что надо
C++
1
ptr->data.id
Ибо data - это не указатель (и не объект с перегруженным оператором ->).
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
08.11.2020, 02:14  [ТС]
DrOffset, я смотрю вы довольно умны и добры. Не могли б вы открыть первую ссылку. И в ней исправить menu.cpp(функция menu1), functions.h и binarysearchtree.h. Понятное дело не все. Хоть пару функций для примера. Просто меня сейчас что то озарило. Но мне кажется я могу напутать. Сейчас исправляю бинарное дерево, но вот не знаю правильно я пишу где-то U и Node или нет
0
 Аватар для Annemesski
2681 / 1341 / 482
Регистрация: 08.11.2016
Сообщений: 3,707
08.11.2020, 02:19
БесподобeH, у Вас класс называется "БинарноДеревоПоиска" понимаете что это значит? Это значит что дочерние элементы располагаются в нем справа или слева от родителя по некоему правилу, например если добавляемый элемент больше родителя, то он добавляется вправо, если меньше, то влево. Как вы собираетесь описывать правила по которым книга добавляется справа от персонажа или персонаж добавляется слева от книги? Вам преподаватель сказал "надо разделить", так и разделите их, опишите класс бинарного дерева поиска с одним шаблонным параметром и в главной функции программы продемонстрируйте работу с Вашим деревом создав дерево для персонажей, дерево для книг, дерево для черта лысого и вызовите их методы.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.11.2020, 02:25
БесподобeH, В чем смысл введения отдельных T и U - (риторически) не понятно.
Как сказано было выше, нужно избавиться от U и везде использовать T. Упростить шаблон - один параметр, а не два.

Явно задавать Node параметром не нужно - это внутренняя кухня класса BinarySearchTree.

Т.е. выглядеть должно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T>
class BinarySearchTree {
private:
    Node<T> *root;
 
///......
};
 
....... примеры
BinarySearchTree<Book> books;
BinarySearchTree<Character> chars;
......
Вся последующая реализация должна отталкиваться от этого представления.
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
08.11.2020, 02:26  [ТС]
Annemesski, господи. Вы тут проблема вообще не в этом. Это все и так разные деревья. Я создал шаблонный класс узла, потому что в тот шаблон я и буду пихать дерево, персонажа и тд. Меня интересует как правильно обращаться к этим элементам. Например при создании дерева для сравнения я использую data(название книги например) которая находиться в классе книга, который находиться в классе узел. И меня интересует как правильно переделать мое дерево. Что б оно работало с эти
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.11.2020, 02:26
Цитата Сообщение от БесподобeH Посмотреть сообщение
Не могли б вы открыть первую ссылку. И в ней исправить menu.cpp(функция menu1), functions.h и binarysearchtree.h.
Нет, этого я делать не буду.
Я понимаю, что вы устали от этой лабы. Поэтому вам нужно просто оставить это на сегодня, а завтра сесть и нормально осмыслить все написанное выше. Дальше вы сможете сами написать реализацию заново. Пытаться исправлять этот код - бессмысленное занятие, в нем слишком много фундаментальных ошибок.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.11.2020, 02:42
Цитата Сообщение от DrOffset Посмотреть сообщение
Ибо
полезная ссылочка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2020, 02:42
Помогаю со студенческими работами здесь

При выборе узла дерева не снимать выделение с дерева, а переводить курсор в datagridview
на форме treeview(слева)datagridview(справа).мне надо чтобы при выборе узла дерева выделение с дерева не снималось а курсор переходил бы в...

Создать класс, в котором можно сохранить любой вызываемый объект или функцию
Возникла идея создать класс, в котором можно сохранить любой вызываемый объект или функцию. Что то наподобие std::function, но только не...

Нужен любой тест, который можно переделать под себя
У кого нибудь есть ли готовый тест можете ли скинуть полностью готовый файл? Пробовал сам но ничего не выходит

Можно ли впихнуть видеокарту?
Компьютер - Проц - amd athlon 64 x2 dual core processor 4200+ бп - vinga vps-400 apfc видеокарта - amd radeon hd 2600 xt sapphire ...

можно ли опереатор условия if впихнуть в цикл for?
Скажите,а можно ли опереатор условия if впихнуть в цикл for?? Добавлено через 8 минут все глянул на 2 главы вперед - понял что...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru