5

我收到此错误“输入'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   
};

我不明白这个问题,真的很想使用引用而不是指针。

谢谢

4

2 回答 2

8

您忘记向我们展示定义,但大概Region1.m_NOO是 type 的对象Cell。您的第一个示例是获取它的地址,并尝试使用生成的指针来初始化引用。引用不是从指针初始化的,而是从对象本身初始化的:

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}
//                                            ^ no &         ^^ don't forget that

使用引用而不是指针有一个警告:它们是不可分配的,因此您的类也不是。通常这不是问题。但是如果你确实需要你的类是可分配的,那么你需要使用一个指针来代替。

于 2013-02-07T15:37:46.643 回答
2

一元运算&符获取指向变量的指针。因此,在 C++ 中(如在 C 中)a = &b获取指向b该值的指针并将其存储在 中a,因此如果b是 type int,则a需要是 type int*。另一方面,对引用的赋值是隐式的,所以如果 a 是类型int&,你只需要编写a=ba引用b. 因此,在您的情况下,您需要将构造函数重写为

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}

但是,我认为在这里使用指针比使用引用更好,并且尝试使用 C++ 而不熟悉指针是一个非常糟糕的主意。所以我建议你花时间让自己对使用指针感到舒服,而不是试图避免它们。

于 2013-02-07T15:24:00.083 回答