2013-06-03 3 views
4

Так что я все еще разбираюсь в семантике ссылок на C++.Инициализация ссылочной переменной в конструкторе класса

У меня есть класс, который имеет ссылку как член, и я инициализирую ссылку в конструкторе.

template<class T> 
class AVLNode { 

private: 
     T & data; 
public: 
     AVLNode(T & newData) { 
      data = newData; 
     } 
}; 

Но я получаю эту ошибку на линии конструктора:

error: uninitialized reference member ‘AVLNode<int>::data’ [-fpermissive] 

я не получаю это, я инициализировать ссылку, как только класс строится так, что не должно быть проблемой с ссылкой неинициализируется право?

+3

Вы не инициализируете его, назначая ему. – chris

+0

не дубликат, ответ на мой вопрос включал четкое определение инициализатора – Ethan

ответ

13

Поскольку data является ссылкой, вы должны инициализировать его в конструкторе инициализаторе:

AVLNode(T & newData): data(newData) { 

} 

Вы можете найти этот пост полезным: reference member variable must be initialized at constructor initialization list. Вам также может понадобиться понять разницу между initialization и assignment при написании конструктора класса.

Цитируя C++ Primer pp455:

Некоторые члены должны быть инициализированы в конструкторе инициализаторе. Для таких членов назначение их в тело конструктора не работает. Члены типа класса, которые не имеют конструктора по умолчанию и члены, которые являются константами или ссылочными типами, должны инициализироваться в инициализаторе конструктора независимо от типа.

+0

Очень интересно. Это работает! Моя книга на C++ на самом деле не затрагивает их вообще! Спасибо за вашу помощь. – Ethan

+1

@ Этан Добро пожаловать. Рад, что это помогает. – taocp

+3

Если на самом деле не упоминается список инициализации членов, запишите эту книгу. –

Смежные вопросы