将引用更新为类成员

时间:2015-04-19 20:30:42

标签: c++ pointers c++11 reference

我很确定我误解了引用。

在下面的代码中,我想初始化A以获得状态,但在将来的某个时候,当我调用init(将B对象注册到A)时,我喜欢stateB变量显示B状态的值。

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

我是否可以通过将stateB的引用更改为b->状态而不将stateB作为指针来执行此操作?

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

class B {
public:
  int state = 1;
}

1 个答案:

答案 0 :(得分:0)

首先,此行无效:

&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超出范围,而您仍然拥有指向其的A,则这些解决方案的两个都会受到悬空指针/引用的影响州。该问题的一个解决方案是简单地使用shared_ptr

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

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

确保B至少与A保持一致。