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

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

30.10.2014, 19:12. Показов 2021. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru