Подтвердить что ты не робот

Инициализация ссылки в конструкторе С++

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

Согласно this, в С++ допустимо следующее:

class c {
public:
   int& i;
};

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

error: uninitialized reference member 'c::i'

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

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

4b9b3361

Ответ 1

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

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) { }.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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;  
}

Спасибо

Ответ 6

template<class T>
class AVLNode {

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