假设 Class 包含一个名为 matrix _ 的引用:
Class.h
class Class
{
Matrix& matrix_;
}
Class.cpp
Class::Class() : matrix_(Matrix())
{
}
我收到错误:无效初始化'Matrix&'类型的非const引用 临时的'矩阵'。
我发现问题是临时对象将消失,引用将指向NULL。如何为引用创建持久对象?我想使用引用,因为这个成员应该是常量。
答案 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)
{
}