【问题标题】:"non-const lvalue reference to type cannot bind" error with reference (Type &) but not with pointer (Type *)“对类型的非 const 左值引用无法绑定”错误与引用(类型 &)但不与指针(类型 *)
【发布时间】:2013-02-07 15:08:26
【问题描述】:

我收到此错误“输入'Cell'的非const左值无法使用此代码绑定到'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   
};

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

谢谢

【问题讨论】:

  • 一方面,您正在尝试将地址分配给第一个块中的引用。
  • &(Region1.m_NOO) 是一个指针。当然你不能将int& 绑定到int*,那么为什么Cell&Cell* 应该不同呢?

标签: c++ pointers reference constants lvalue


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    一元& 运算符获取指向变量的指针。因此,在 C++ 中(如在 C 中)a = &b 获取指向 b 的指针并将此值存储在 a 中,因此如果 b 的类型为 inta 的类型必须为 @987654328 @。另一方面,对引用的赋值是隐式的,因此如果 a 的类型为 int&,您只需编写 a=b 以使 a 成为对 b 的引用。因此,在您的情况下,您需要将构造函数重写为

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

    但是,我认为您最好使用指针而不是此处的引用无论如何,并且尝试使用 C++ 而不熟悉指针是一个非常糟糕的主意。所以我建议你花时间让自己习惯于使用指针而不是试图避免它们。

    【讨论】:

    • 太好了,我会尽量坚持使用指针。如果这个变量在 Region 类中是私有的,有什么方法可以访问 Region1.m_NOO?
    • 不,这就是private 的意义所在。如果您想访问它,您需要 (1) 使 RegionHolder::RegionHolder 成为 Region 的朋友或 (2) 向 Region 添加访问器函数,例如Region* GetNOO() { return &m_Noo; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2020-09-01
    • 2018-08-22
    • 2020-05-08
    • 2021-03-03
    • 2021-07-19
    相关资源
    最近更新 更多