传递对象地址时"Address expression must be an lvalue or a function designator"

"Address expression must be an lvalue or a function designator" when passing an object's address

本文关键字:lvalue an or designator function be expression 对象 地址 Address must      更新时间:2023-10-16

这是我代码的一部分:

class A
{
  public:
  void init(classB& pObject);
  classB& _pObject;
}
void classA::init(classB& pObject)
{
  _pObject = pObject;
}
class B
{
  public:
  void init();
}
void classB::init()
{
  classA* pClassA = new classA;
  pClassA->init(&this);
}

编译后我遇到了 2 个问题:

  1. _pObject = pObject;:没有可行的重载"="

  2. pClassA->init(&this);:地址表达式必须是左值或函数指示符

我对这些问题感到困惑...我该如何解决这个问题?

首先,问题中有一个错别字。我假设AclassA指的是同一个类,BclassB也是如此。

1) 引用和指针之间的少数区别之一是,一旦初始化引用,就不能为引用分配不同的值。所以你不能分配给_pObject,尽管你可以在类A的构造函数的初始化列表中初始化它:

classA::classA(classB& object) : _pObject(object) // Correct
{
  // _pObject = object;        on the other hand, this would be incorrect
}

2)&thisthis的地址,但你实际上想要一个对this所指向的值的引用。您需要改用*this。尽管我们已经看到,没有办法使函数classA::init与您当前的类设计一起工作。如果确实要在构造对象后更改_pObject的值,则需要将其设置为classB*而不是classB&

1)在这种情况下,您应该使用*this,因为&this具有ClassB**的类型,而不是ClassB&;

2) 您只能在构造函数中初始化引用成员变量:

classA::classA(classB& b) : _pObject(b)
{
}

(顺便说一句,我想你省略了delete声明只是为了简洁起见)

相关文章: