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

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

30.10.2014, 19:12. Просмотров 656. Ответов 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;
};
При написание что то вроде
http://www.cyberforum.ru/cpp-beginners/thread526333.html
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2014, 19:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос BST дерево. Инициализация класса внутри класса (C++):

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

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

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

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

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

3
sergestus
77 / 77 / 34
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
30.10.2014, 19:16 #2
Нужно создать и инициализировать объект класса Node, а не сам класс:
Node node;
Collection (T1 _key, T2 _data) : node(_key, _data) {}
1
Skaarj
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 55
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
sergestus
77 / 77 / 34
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2014, 15:55
Привет! Вот еще темы с решениями:

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

Бинарное дерево подклассов основного класса-узла. Доступ к подклассам по указателю - объекту класса-родителя
Короче, необходимо сделать бинарное дерево, решающее арифметическое выражение,...

Создать объект внутри класса, который может вызывать функцию этого класса
Ребята помогите уже несколько дней мучаюсь. Хочу сделать программу в консоле...

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h...


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

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

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