作为 Class 成员更新参考

Updating a Reference as a Class Member

我很确定我误解了参考资料。

在下面的代码中,我想将 A 初始化为一个状态,但在将来的某个时间,当我调用 init(将 B 对象注册到 A)时,我希望 stateB 变量为显示B状态的值。

我可以通过使 stateB 成为指针,然后在 A 的构造函数中初始化一些内存并将其设置为默认值,然后移动此指针并在调用 init 时删除内存来实现。

我可以通过将 stateB 的引用更改为 b->state 而在 stateB 不作为指针的情况下执行此操作吗?

Class A {
public:
  int stateB = 0;
  B *b = nullptr;
  void init(B *b) {
     &state = &b->state;
  }
}

class B {
public:
  int state = 1;
}

首先,这一行无效:

&state = &b->state;

您不能分配给 state 的地址。你所能做的就是state = b->state,但这并不能满足你所​​有需要的语义。这给你留下了几个选择。您可以使 stateB 成为一个指针:

class A {
    int* stateB;

public:
    void init(B* b) {
        stateB = &b->state;
    }
};

但是你不能stateB作为参考。引用必须被初始化并且永远不能被重新分配。因此,如果您希望将 A 重新初始化为多个不同的 B,那么您必须坚持使用指针。但是,如果您想有效地将​​ A 绑定到单个 B,那么引用就可以了:

class A {
    int& stateB;
public:
    A(B& b) : stateB(b.state) { } // must be initialized
                                  // in the ctor
                                  // this A can only ever point to this
                                  // specific B
{ };

请注意,如果 B 超出范围,而您仍然拥有 [=18],则这些解决方案 都可能会出现悬空 pointer/reference =] 指的是它的状态。该问题的一种解决方案是简单地使用 shared_ptr:

class A {
    std::shared_ptr<int> stateB;

public:
    A(std::shared_ptr<B> b)
    : stateB(b, &b->state)  // "aliasing" constructor
    { }
};

这确保 B 至少与 A 一样长。