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

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

30.10.2014, 19:12. Показов 1281. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2014, 19:12
Ответы с готовыми решениями:

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

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

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

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

3
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
30.10.2014, 19:16 2
Нужно создать и инициализировать объект класса Node, а не сам класс:
Node node;
Collection (T1 _key, T2 _data) : node(_key, _data) {}
1
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
31.10.2014, 10:00  [ТС] 3
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 4
Цитата Сообщение от Skaarj Посмотреть сообщение
Теперь вот возникла проблема, как получать доступ к данным из protected секции Node? Выдаёт error C2248: Collection<T1,T2>::Node::key: невозможно обратиться к protected член, объявленному в классе "Collection<T1,T2>::Node".
можно добавить в класс Node строку: friend Collection;

Цитата Сообщение от Skaarj Посмотреть сообщение
Можно получить доступ к этим данным через геттеры , но как я говорил хотелось бы как нибудь покрасивее сделать без лишних методов в классе Node. Если бы класс Collection был наследником Node(что нелогично), то можно было бы получить доступ через простое наследование, а тут когда один класс внутри другого.. непонятно.
Так будет правильнее. А если без лишних методов почему не перевести объявления в public?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2014, 15:55

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.