Форум программистов, компьютерный форум CyberForum.ru

Инициализация static члена класса - C++

Восстановить пароль Регистрация
 
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
03.05.2014, 20:59     Инициализация static члена класса #1
Добрый вечер! Есть класс, в нём в private реализован ещё один + это всё шаблоны. Во вложенном классе есть static указатель на переменную типа этого вложенного класса. Вопрос - как инициализировать эту переменную и возможно ли это? Если нет или если есть вариант по проще, как сделать nilPtr, что бы на неё в моём дереве указывали все листья, то буду очень благодарен решению.
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
enum colors {black = false, red = true};
 
template< typename T>
class RBTree
{
    public:
        RBTree();
        ~RBTree();
 
        RBTree<T>& insert(const T&);
        void view() const;
 
    private:
        template< typename T> class Node;
 
        Node<T> *rootPtr;
 
        template< typename T> class Node
        {
            friend class RBTree;
            static Node<T> *nilPtr; // как для вот этого вызвать... 
 
            public:
                Node()              // ...вот этот конструктор?
                {
                    parentPtr = leftPtr = rightPtr = this;
                    key = 0;
                    color = black;
                };
 
                Node(const T &value, colors clr)
                {
                    parentPtr = leftPtr = rightPtr = nilPtr;
                    key = value;
                    color = clr;
                };
 
            private:
                T key;
                colors color;
                Node<T> *parentPtr;
                Node<T> *leftPtr;
                Node<T> *rightPtr;
        };
 
        void leftRotate(Node<T>*);
        void rightRotate(Node<T>*);
        void insertFixup(Node<T>*);
        void viewHelper(Node<T>*, int) const;
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2014, 20:59     Инициализация static члена класса
Посмотрите здесь:

C++ Инициализация static переменной
C++ Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
C++ Инициализация константного статического объекта - члена класса
C++ Инициализация константы-члена класса
Инициализация статического члена std::vector в шаблонном классе C++
Инициализация static map C++
Инициализация константного члена класса с проверкой значения C++
Инициализация переменной члена класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6443 / 3817 / 885
Регистрация: 30.01.2014
Сообщений: 6,611
03.05.2014, 21:12     Инициализация static члена класса #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
pihta, один уточняющий вопрос. T из внешнего класса равно T из внутреннего или это разные T?
В любом случае этот код содержит ошибку. Если это один и тот же T, то смысл делать шаблонным внутренний класс Node отпадает. Если это разные T, то они должны иметь разные имена. И да, если компилятор из VS и он это собирает, то это только потому, что там не реализован two phase lookup.
Склоняясь к тому, что это один и тот же T, вот решение:
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
template< typename T>
class RBTree
{
public:
    RBTree();
    ~RBTree();
 
    RBTree<T>& insert(const T&);
    void view() const;
 
private:
    class Node;
 
    Node *rootPtr;
 
    class Node
    {
        friend class RBTree;
        static Node * nilPtr; // как для вот этого вызвать...
 
    public:
        Node()              // ...вот этот конструктор?
        {
            parentPtr = leftPtr = rightPtr = this;
            key = 0;
            color = black;
        };
 
        Node(const T &value, colors clr)
        {
            parentPtr = leftPtr = rightPtr = nilPtr;
            key = value;
            color = clr;
        };
 
    private:
        T key;
        colors color;
        Node *parentPtr;
        Node *leftPtr;
        Node *rightPtr;
    };
 
    void leftRotate(Node *);
    void rightRotate(Node *);
    void insertFixup(Node *);
    void viewHelper(Node *, int) const;
};
 
// в hpp
template< typename T>
typename RBTree<T>::Node * RBTree<T>::Node::nilPtr = 0;
Yandex
Объявления
03.05.2014, 21:12     Инициализация static члена класса
Ответ Создать тему
Опции темы

Текущее время: 19:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru