我收到此错误“类型为'Cell'的非常量值不能使用此代码绑定到'Cell *'类型的临时值:
class RegionHolder
{
public:
RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
~RegionHolder();
protected:
Cell & m_RegionCellNOO; // difference is here
};
但不是这个:
class RegionHolder
{
public:
RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
~RegionHolder();
protected:
Cell * m_RegionCellNOO; // difference is here
};
我不明白这个问题,并且真的想使用引用而不是指针。
由于
答案 0 :(得分:6)
您忘了向我们展示定义,但可能Region1.m_NOO
是Cell
类型的对象。您的第一个示例是获取它的地址,并尝试使用结果指针初始化引用。引用不是从指针初始化,而是从对象本身初始化:
RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}
// ^ no & ^^ don't forget that
使用引用而不是指针有一个警告:它们不可分配,因此你的类也不是。通常这不是问题;但是如果你确实需要你的类是可分配的,那么你需要使用指针。
答案 1 :(得分:1)
一元&
运算符获取指向变量的指针。因此,在C ++中(如在C中)a = &b
获取指向b
的指针并将此值存储在a
中,因此如果b
的类型为int
, a
必须是int*
类型。另一方面,对引用的赋值是隐式的,因此如果a类型为int&
,则只需编写a=b
即可使a
引用b
。因此,在您的情况下,您需要将构造函数重写为
RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}
但是,我觉得你最好不要使用指针而不是 ,并试图使用C ++而不熟悉指针是一个非常糟糕的主意。所以我建议你花点时间让自己习惯使用指针而不是试图避免它们。