Инициализация ссылок - PullRequest
       3

Инициализация ссылок

0 голосов
/ 03 марта 2011

Я написал следующий код, и я ожидал получить 5 6 6 6, но я получил 5 6 5 0 вместо этого. Кажется, что «val» правильно получает ссылку в начале, но потом теряется. Кто-нибудь знает, где моя ошибка?

class Count {

    public:  
    void add() {  
    val++;
    }
    void print() {  
    cout << val  << endl;  
    }  
    Count(int c): val(c) {  
    }  
    private:  
    int &val;
};  

int main() {  

    int c = 5;  
    Count teste(c);  
    teste.print();  
    teste.add();  
    teste.print();  
    cout << c << endl;  
    teste.print();  
    return 0;  
}

Ответы [ 4 ]

5 голосов
/ 03 марта 2011

Ваш конструктор должен принимать параметр по ссылке, а не по значению.

1 голос
/ 03 марта 2011

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

Какой это компилятор?

Как указывает SpaceCowboy, если ваш конструктор принимаетэталонный параметр это будет работать.Это должно сделать, это нормальный способ обернуть ссылку.Конечно, val будет недействительным, как только c выйдет из области видимости.

0 голосов
/ 03 марта 2011

Да.Измените 'int & val' на 'int val' или измените 'Count (int c)' на 'Count (int & c)', что сделает эту работу.к настоящему времени вы получаете копию в c'tor, и поскольку вы присваиваете эту копию ссылке , вы получите неопределенное поведение, потому что, когда поток выходит из области действия конструктора, копия будет прервана, следовательно,Ваш объект будет содержать ссылку на случайное место в стеке!

0 голосов
/ 03 марта 2011

Вы устанавливаете свой закрытый член val как ссылку на локальную переменную c в своем конструкторе. Когда вы выходите из конструктора, это ссылка на какое-то случайное значение в вашем стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...