我很确定我误解了引用。
在下面的代码中,我想初始化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;
}
答案 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
保持一致。