如果引用是类成员,如何初始化对象的引用?

时间:2010-11-15 17:46:25

标签: c++ pointers reference persistence member

假设 Class 包含一个名为 matrix _ 的引用:

Class.h

class Class
{
Matrix& matrix_;
}

Class.cpp

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

我收到错误:无效初始化'Matrix&'类型的非const引用  临时的'矩阵'。

我发现问题是临时对象将消失,引用将指向NULL。如何为引用创建持久对象?我想使用引用,因为这个成员应该是常量。

4 个答案:

答案 0 :(得分:5)

Class::Class() : matrix_(Matrix())尝试将引用设置为指向临时对象,这是非法的。

嗯,有一个const引用和临时绑定的情况,但严重的是,不要去那里。

看起来你只需要使用聚合:

class Class
{
const Matrix matrix_;
};

初始化列表:

Class::Class() : matrix_() /* or any params to the constructor if you need them */
{
}

答案 1 :(得分:3)

Matrix引用必须作为Class的所有构造函数的参数提供。

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

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

请注意,尽管引用将是常量(C ++引用是常量指针),但引用的Matrix不会,除非添加const说明符。

答案 2 :(得分:1)

问题是引用并不意味着用于此。它们更多地被用作已存在的东西的“别名”。无论是匿名堆栈对象(其生命由代码范围控制)还是具有自己已存在指针的堆对象。在你的情况下,你试图仅使用引用作为其常量属性,但忘记它不仅仅是一个常量指针。

适当的解决方案是使用常量指针并在堆上分配新对象,如下所示:

Class.h

class Class
{
Matrix* const matrix_;
}

Class.cpp

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

答案 3 :(得分:1)

您不必使用此成员的引用为常量。您可以使用boost::scoped_ptr<const Matrix>

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

Class::Class() : _matrix(new Matrix)
{
}