作为 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
一样长。
我很确定我误解了参考资料。
在下面的代码中,我想将 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
一样长。