Я знаю, с помощью указателей вы можете сделать это:
T * myPtr = 0;
который устанавливает указатель на значение NULL. Однако, когда я пытаюсь сделать это:
T * myPtrArray[2] = {0, 0};
Я получаю синтаксическую ошибку «ожидаемое выражение». Зачем?
Обратите внимание, я использую g ++, и приведенный выше код происходит в конструкторе класса:
template <class T>
RBTree<T>::RBTree() {
m_Data = T();
m_Children = {0, 0};
m_Parent = 0;
m_Color = BLACK;
}
где рассматриваемые члены класса объявлены как:
T m_Data;
RBTree<T> * m_Children[2];
RBTree<T> * m_Parent;
bool m_Color;
Форма T * myPtrArray[2] = {0, 0};
называется агрегатная инициализация. У него нет аналога в назначении, поэтому написание
T * myPtrArray[2];
myPtrArray = {0, 0};
является недействительным.
В случае конструирования класса, агрегатная инициализация недоступна в c ++ 98/03.
Если ваш компилятор поддерживает стандарт c ++ 11, вы можете использовать единый синтаксис инициализации. Есть два способа инициализации m_Children
в вашем примере:
В конструкторе:
template <class T>
RBTree<T>::RBTree(): m_Children {0, 0} /* other init here */ {
}
Во время объявления члена класса:
T m_Data;
RBTree<T> * m_Children[2] {0, 0};
RBTree<T> * m_Parent;
bool m_Color;
Начиная с C ++ 11, вы можете использовать nullptr
вместо 0
, С помощью nullptr
является предпочтительным, так как это указатель, а не целое число. Затем вы можете сделать:
T * myPtrArray[2] = {nullptr, nullptr};
Во всяком случае, ваш код работает нормально на моем компиляторе, вы можете увидеть пример, используя оба 0
а также nullptr
компилируется без ошибок на идеоне.