Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56

BST дерево. Инициализация класса внутри класса

30.10.2014, 19:12. Показов 2013. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужно реализовать класс дерева бинарного поиска с использованием итератора. Возник вопрос, как инициализировать через конструктор Collection члены класса Node key и data? Что то непонятно как вообще инициализировать сложные структуры(классы) внутри класса... Класс должен быть такого вида:
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
template <class T1, class T2> class Collection
{
protected:
 
public:
    
    Collection () {}
    Collection (T1 _key, T2 _data) {} // Как инициализировать key и data? 
    ~Collection () {}
 
    Collection (const Collection<T1, T2> &other);
    Collection operator=(const Collection<T1, T2> &other) {}
 
    class Node
    {
    private:
        T1 key; 
        T2 data; 
        Node *left; 
        Node *right;
 
    public:
        Node() {}
        Node(T1 _key, T2 _data) : key(_key), data(_data), left(NULL), right(NULL    ) {}
        Node(const Node &other) { key = other.key; data = other.data; left = other.left; right = other.right; }
    };
 
    class Iterator
    {
        Collection *ptr;    //указатель на объект коллекции
        Node *cur;      //указатель на текущий элемент коллекции
        public:
 
    };
friend class Iterator;
};
При написание что то вроде
C++
1
    Collection (T1 _key, T2 _data) : Node(_key, _data) {}
выдаёт ошибку error C2436: Node: функция-член или вложенный класс в списке инициализации конструктора.

Добавлено через 12 минут
Кажется разобрался. Я инициализировал так
C++
1
Collection<int, int> collect(5 , 5);
, а надо было так
C++
1
Collection<int, int>::Node collect(5 , 5);
Но это получается я использую конструктор класса Node в пространстве имён Collection<int, int>? А через конструктор Collection получается нельзя инициализировать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.10.2014, 19:12
Ответы с готовыми решениями:

Инициализация класса A внутри класса B
заранее извиняюсь, наверняка подобное было на одной из 1000 страниц=)... есть 2 класса //собственно первый класс class matrix ...

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно, пытаюсь разобраться что происходит в...

Инициализация массива строк внутри класса
Доброго времени суток! Есть такая проблема... Дан класс, в нем есть массив строк и мне нужно в конструкторе ему задать начальное значение,...

3
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
30.10.2014, 19:16
Нужно создать и инициализировать объект класса Node, а не сам класс:
Node node;
Collection (T1 _key, T2 _data) : node(_key, _data) {}
1
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
31.10.2014, 10:00  [ТС]
Node - это у меня это структура, которую я хочу использовать как простейший элемент. То есть без всяких лишних методов, только члены-данные и конструкторы. А методы по добавлению/удалению/поиску уже будут от класса collection и итератора.

С этим я более-менее разобрался, как то всё очевидно оказалось - надо было в colletion добавлять элемент класса Node, ну и конструктор правильный написать.

Теперь вот возникла проблема, как получать доступ к данным из protected секции Node? Выдаёт error C2248: Collection<T1,T2>::Node::key: невозможно обратиться к protected член, объявленному в классе "Collection<T1,T2>::Node".

Можно получить доступ к этим данным через геттеры , но как я говорил хотелось бы как нибудь покрасивее сделать без лишних методов в классе Node. Если бы класс Collection был наследником Node(что нелогично), то можно было бы получить доступ через простое наследование, а тут когда один класс внутри другого.. непонятно.


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
template <class T1, class T2> class Collection
{
public:
    friend class Node;
    friend class Iterator;
 
    class Node
    {
    protected:
        T1 key; //ключ в элементе
        T2 data; //данные в элементе
        Node *left; //указатели на соседние элементы структуры
        Node *right;
 
    public:
        Node() : key(NULL), data(NULL), left(NULL), right(NULL) {}
        Node(T1 _key, T2 _data) : key(_key), data(_data) {} // конструктор элемента
        Node(const Node &other) : key(other.key), data(other.data), left(other.left), right(other.right) {}
        Node operator=(const Node &other) { key(other.key); data(other.data); left(other.left); right(other.right); }
 
//      T1 get_key() { return key; }
//      T2 get_data() { return data; }
//      Node *get_left() { return left; }
//      Node *get_right() { return right; }
    };
 
protected:
    Node* head;
 
public:
 
    Collection () : head(NULL) {}   //конструктор по умолчанию
    Collection (T1 _key, T2 _data) { Node *node = new Node(_key, _data); head = node; }
    ~Collection () {}   //деструктор
    Collection (const Collection<T1, T2> &other) {} // конструктор копирования
    Collection operator=(const Collection &other) {}
 
void show()
{
    std::cout << head->key << " " << head->data <<  std::endl;
}
 
};
C++
1
2
3
4
5
6
7
int main()
{
    Collection<int, char*> col(15, " so exciting!");
    col.show();
 
    _getch();
}
0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
03.11.2014, 15:55
Цитата Сообщение от Skaarj Посмотреть сообщение
Теперь вот возникла проблема, как получать доступ к данным из protected секции Node? Выдаёт error C2248: Collection<T1,T2>::Node::key: невозможно обратиться к protected член, объявленному в классе "Collection<T1,T2>::Node".
можно добавить в класс Node строку: friend Collection;

Цитата Сообщение от Skaarj Посмотреть сообщение
Можно получить доступ к этим данным через геттеры , но как я говорил хотелось бы как нибудь покрасивее сделать без лишних методов в классе Node. Если бы класс Collection был наследником Node(что нелогично), то можно было бы получить доступ через простое наследование, а тут когда один класс внутри другого.. непонятно.
Так будет правильнее. А если без лишних методов почему не перевести объявления в public?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2014, 15:55
Помогаю со студенческими работами здесь

Инициализация обьекта внутри другого класса
Всем привет. Вообщем проблема такая. Есть несколько классов class WeaponType { }; class Swords : public WeaponType { }; ...

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса)
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1; const int ySize = 1; class...

Инициализация экземпляра класса, как поле другого класса
Всем доброго времени суток ! Есть класс: class a{ public: a(int _type): type(_type) {} private: int type; }

Инициализация членов дочернего класса членами класса родителя
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами класса A?

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса Date,мне нужно,чтобы при создании Subscriber объекты класса...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru