Для инициализации ссылочного члена требуется временная переменная C ++

<object width="400" height="400" data="helloworld.pdf"></object>
13
задан Peter Mortensen 9 November 2009 в 14:49
поделиться

11 ответов

Ссылка должна быть инициализирована, чтобы ссылаться на что-либо; он не может ссылаться ни на что, поэтому вы не можете создать по умолчанию класс, содержащий один ценность). Вам понадобится конструктор, которому присвоен Div , чтобы ссылаться на:

explicit A(Div &d) : divs(d) {}

Если вы хотите, чтобы он мог быть «нулевым», то вам нужен указатель, а не ссылка.

33
ответ дан 1 December 2019 в 17:15
поделиться

div - это ссылка, а не указатель. Вы не можете установить его в NULL, он должен указывать на какой-то реальный объект. Лучше всего здесь, вероятно, определить статический / глобальный экземпляр Div, который вы произвольно определяете как «Null Div» (установите его значение на то, что вы вряд ли когда-либо будете использовать) и инициализировать div для этого. Примерно так:

struct Div
{
   int i;
   int j;
};   

Div NULL_DIV = { INT_MAX, INT_MAX };

class A
{
    public:
             A();
             Div& divs;
};


A::A() : divs(NULL_DIVS)
{
}

Или, в качестве альтернативы, просто сделайте divs указателем вместо ссылки.

* Обратите внимание, что вы не можете использовать ссылку на константу, если не отбросите константу, потому что по умолчанию компилятор не разрешает вы назначаете cosnt ref неконстантной ссылке

12
ответ дан 1 December 2019 в 17:15
поделиться

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

8
ответ дан 1 December 2019 в 17:15
поделиться

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

3
ответ дан 1 December 2019 в 17:15
поделиться

На «английском»: ссылка относится к чему-то . Он не может ссылаться на ничего (null). Вот почему ссылки безопаснее использовать, чем указатели.

6
ответ дан 1 December 2019 в 17:15
поделиться

Ссылки должны на что-то ссылаться. В языке C ++ нет такой вещи, как пустая ссылка. Если член может не иметь значения, тогда это должен быть указатель, или boost :: optional , или какой-то подобный тип.

Ссылка должна быть инициализирована для ссылки на действительный объект.

3
ответ дан 1 December 2019 в 17:15
поделиться

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

В вашем случае вы используете rvalue ( NULL ) для инициализации ссылки. Когда такая инициализация разрешена, rvalue преобразуется во временный объект, к которому будет привязана ссылка. Итак, компилятор сразу это осознал и сообщил вам об этом диагностическим сообщением.

На самом деле подобный трюк разрешен только для ссылок const , поэтому ваш код не работает, поскольку в нашем случае ссылка не const . Кроме того, ссылка struct , как в вашем коде, не может быть инициализирован с помощью rvalue NULL (который имеет целочисленный тип), поэтому он также не работает по этой причине.

Однако сообщение компилятора вводит в заблуждение. Текст сообщения, кажется, подразумевает, что инициализировать ссылки на члены временными объектами незаконно. Фактически, это допустимо для C ++ (после устранения вышеуказанных проблем), хотя это не имеет смысла. Но, как мне кажется, если некорректный код сопровождается хоть каким-то сообщением об ошибке, все должно быть в порядке ...

3
ответ дан 1 December 2019 в 17:15
поделиться

Просто и понятно:

Ссылка никогда не может быть ПУСТОЙ.

2
ответ дан 1 December 2019 в 17:15
поделиться

Вы должны попробовать инициализировать вашу переменную "divs". У вас не может быть ссылки на «ничего» ...

Посмотрите здесь:

http://msdn.microsoft.com/en-us/library/bbt3ewya%28VS.80%29.aspx

Надеюсь, это немного поможет!

1
ответ дан 1 December 2019 в 17:15
поделиться

Как отмечалось в других сообщениях, ссылки (Div &) не могут быть нулевыми. Итак, самое простое изменение, которое вы можете сделать, - это предоставить ссылку в конструкторе и инициализировать ссылочный член. Например,

class A
{
    public:
             A(Div& inDivs);
             Div& divs;

};

public A::A( Div& inDivs )
: divs( inDivs )
{}
1
ответ дан 1 December 2019 в 17:15
поделиться
class A
{
    Div & ref(Div div) { return div; }
    public:
       A() : divs(ref(Div())) {};
       Div& divs;
};
1
ответ дан 1 December 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: