<object width="400" height="400" data="helloworld.pdf"></object>
Ссылка должна быть инициализирована, чтобы ссылаться на что-либо; он не может ссылаться ни на что, поэтому вы не можете создать по умолчанию класс, содержащий один ценность). Вам понадобится конструктор, которому присвоен Div
, чтобы ссылаться на:
explicit A(Div &d) : divs(d) {}
Если вы хотите, чтобы он мог быть «нулевым», то вам нужен указатель, а не ссылка.
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 неконстантной ссылке
Во-первых, у вас не может быть ссылки NULL. Во-вторых, все ссылки на переменные в классе должны быть инициализированы во время построения.
Имейте в виду, что, как только ссылка инициализируется, чтобы указывать на что-то, вы не можете изменить ее, чтобы указать на что-то еще. Если это нежелательное поведение, тогда вам следует использовать указатель или копию объекта.
На «английском»: ссылка относится к чему-то . Он не может ссылаться на ничего (null). Вот почему ссылки безопаснее использовать, чем указатели.
Ссылки должны на что-то ссылаться. В языке C ++ нет такой вещи, как пустая ссылка. Если член может не иметь значения, тогда это должен быть указатель, или boost :: optional
, или какой-то подобный тип.
Ссылка должна быть инициализирована для ссылки на действительный объект.
Сообщение компилятора - одно из тех сообщений, которые не имеют смысла с точки зрения языка, но раскрывают внутреннюю работу компилятора, последовательность, в которой работает его внутренняя логика.
В вашем случае вы используете rvalue ( NULL
) для инициализации ссылки. Когда такая инициализация разрешена, rvalue преобразуется во временный объект, к которому будет привязана ссылка. Итак, компилятор сразу это осознал и сообщил вам об этом диагностическим сообщением.
На самом деле подобный трюк разрешен только для ссылок const
, поэтому ваш код не работает, поскольку в нашем случае ссылка не const
. Кроме того, ссылка struct
, как в вашем коде, не может быть инициализирован с помощью rvalue NULL
(который имеет целочисленный тип), поэтому он также не работает по этой причине.
Однако сообщение компилятора вводит в заблуждение. Текст сообщения, кажется, подразумевает, что инициализировать ссылки на члены временными объектами незаконно. Фактически, это допустимо для C ++ (после устранения вышеуказанных проблем), хотя это не имеет смысла. Но, как мне кажется, если некорректный код сопровождается хоть каким-то сообщением об ошибке, все должно быть в порядке ...
Просто и понятно:
Ссылка никогда не может быть ПУСТОЙ.
Вы должны попробовать инициализировать вашу переменную "divs". У вас не может быть ссылки на «ничего» ...
Посмотрите здесь:
http://msdn.microsoft.com/en-us/library/bbt3ewya%28VS.80%29.aspx
Надеюсь, это немного поможет!
Как отмечалось в других сообщениях, ссылки (Div &) не могут быть нулевыми. Итак, самое простое изменение, которое вы можете сделать, - это предоставить ссылку в конструкторе и инициализировать ссылочный член. Например,
class A
{
public:
A(Div& inDivs);
Div& divs;
};
public A::A( Div& inDivs )
: divs( inDivs )
{}
class A
{
Div & ref(Div div) { return div; }
public:
A() : divs(ref(Div())) {};
Div& divs;
};