Инициализирующая ссылка в конструкторе C ++ - PullRequest
27 голосов
/ 05 июля 2011

Я не думаю, что это дублирующий вопрос.Есть похожие, но они не помогают мне решить мою проблему.

Согласно this , в C ++ действует следующее:

class c {
public:
   int& i;
};

Однако, когдаЯ делаю это, я получаю следующую ошибку:

error: uninitialized reference member 'c::i'

Как я могу успешно инициализировать i=0 при создании?

Большое спасибо.

Ответы [ 6 ]

34 голосов
/ 05 июля 2011

Нет такой вещи как "пустая ссылка".У вас есть для предоставления ссылки при инициализации объекта.Поместите его в базовый список инициализатора конструктора:

class c
{
public:
  c(int & a) : i(a) { }
  int & i;
};

Альтернативой будет i(*new int), но это будет ужасно.

Редактировать: Возможно, ответитьваш вопрос, вы, вероятно, просто хотите, чтобы i был объектом-членом, а не ссылкой, поэтому просто скажите int i; и напишите конструктор либо как c() : i(0) {}, либо как c(int a = 0) : i(a) { }.

6 голосов
/ 05 июля 2011
4 голосов
/ 05 июля 2011

Помимо приятного синтаксиса, ключевой особенностью ссылок является то, что вы почти уверены, что оно всегда указывает на значение (без значения NULL).

При разработке API вынуждает пользователя не отправлять вам NULL. При использовании API вы без чтения документа знаете, что NULL здесь не подходит.

0 голосов
/ 10 октября 2016

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

class Test  
{  
    private:
        int& val;  
        std::set<int>& _set;  
    public:  
        Test() : val (*(new int())),  
                _set(*(new std::set<int>())) {  }  

        Test(int &a, std::set<int>& sett) :  val(a), _set(sett) {  }  
};  

int main()  
{  
    cout << "Hello World!" << endl;  
    Test obj;  
    int a; std::set<int> sett;  
    Test obj1(a, sett);  
    return 0;  
}

Спасибо

0 голосов
/ 03 апреля 2016
template<class T>
class AVLNode {

private:
       T & data;
public:
       AVLNode(T & newData) {
            data = newData;
        }
};
0 голосов
/ 05 июля 2011

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

Вы должны использовать инициализатор в своем конструкторе:

class c {
public:
   c(const int& other) : i(other) {}
   int& i;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...