Как инициализировать ссылку на объект, если ссылка является членом класса? - PullRequest
3 голосов
/ 15 ноября 2010

Допустим, Класс содержит ссылку под названием matrix_ :

Class.h

class Class
{
Matrix& matrix_;
}

Class.cpp

Class::Class() : matrix_(Matrix())
{
}

Я получаю сообщение об ошибке: неверная инициализация неконстантной ссылки типа 'Matrix &' из временного типа 'Matrix'.

Я вижу, что проблема заключается в том, что временный объект исчезнет иссылка будет указывать на NULL.Как я могу создать постоянный объект для ссылки?Я хочу использовать ссылку, потому что этот член должен быть постоянным.

Ответы [ 4 ]

5 голосов
/ 15 ноября 2010

Class::Class() : matrix_(Matrix()) пытается установить ссылку, указывающую на временный объект, что недопустимо.

хорошо, есть случай с константными ссылками и временным связыванием, но если серьезно, не идите туда.

Похоже, вам нужно использовать агрегацию:

class Class
{
const Matrix matrix_;
};

И список инициализаторов:

Class::Class() : matrix_() /* or any params to the constructor if you need them */
{
}
3 голосов
/ 15 ноября 2010

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

class Class
{
  Matrix & matrix_;
public:
  Class(Matrix & matrix);
};

Class::Class(Matrix & matrix) : matrix_(matrix)
{
}

Обратите внимание, что хотя ссылка будет постоянной (ссылки C ++ являются константными указателями), Матрица, на которую ссылаются, не будет, если вы не добавите спецификатор const.

1 голос
/ 15 ноября 2010

Вам не нужно использовать ссылку для этого члена, чтобы быть постоянным. Вы можете использовать boost::scoped_ptr<const Matrix>.

class Class
{
public:
    Class();
private:
    boost::scoped_ptr<const Matrix> _matrix;
}

Class::Class() : _matrix(new Matrix)
{
}
1 голос
/ 15 ноября 2010

Проблема в том, что ссылки не предназначены для этого.Они должны использоваться скорее как «псевдоним» для чего-то уже существующего.Будь то анонимный объект стека (чья жизнь контролируется областью кодов) или объект кучи с собственным уже существующим указателем.В вашем случае вы пытаетесь использовать ссылку только для ее константного свойства, но забыли, что это больше, чем указатель на константу.

Подходящим решением будет использование указателя на константу и выделение нового объекта в куче следующим образом:

Class.h

class Class
{
Matrix* const matrix_;
}

Class.cpp

Class::Class() : matrix_(new Matrix())
{
}
...