C ++ Инициализация массива указателей

Я знаю, с помощью указателей вы можете сделать это:

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;

0

Решение

Форма T * myPtrArray[2] = {0, 0}; называется агрегатная инициализация. У него нет аналога в назначении, поэтому написание

T * myPtrArray[2];
myPtrArray = {0, 0};

является недействительным.

В случае конструирования класса, агрегатная инициализация недоступна в c ++ 98/03.

Если ваш компилятор поддерживает стандарт c ++ 11, вы можете использовать единый синтаксис инициализации. Есть два способа инициализации m_Children в вашем примере:

# 1

В конструкторе:

template <class T>
RBTree<T>::RBTree(): m_Children {0, 0} /* other init here */ {

}

# 2

Во время объявления члена класса:

T m_Data;
RBTree<T> * m_Children[2] {0, 0};
RBTree<T> * m_Parent;
bool m_Color;
1

Другие решения

Начиная с C ++ 11, вы можете использовать nullptr вместо 0, С помощью nullptr является предпочтительным, так как это указатель, а не целое число. Затем вы можете сделать:

T * myPtrArray[2] = {nullptr, nullptr};

Во всяком случае, ваш код работает нормально на моем компиляторе, вы можете увидеть пример, используя оба 0 а также nullptr компилируется без ошибок на идеоне.

0

По вопросам рекламы [email protected]