我重新创建了我所看到的问题的小示例。
我有两节课。类所有者有一个成员变量a。 Client类有一个成员变量,它引用Owner实例的成员变量a。当我更新 Owner 实例中的成员变量时,Client 实例中的引用保持与最初设置时相同。
这是我演示问题的代码:
class Client {
public:
Client() : mr_a(default_a) {}
const uint32_t& get_a() const { return mr_a; }
void set_a(uint32_t& a) {
const uint32_t old_a = mr_a;
mr_a = a;
std::cout << "Updating mr_a from " << old_a << " to " << mr_a << std::endl << std::endl;
}
public:
static uint32_t default_a;
private:
uint32_t& mr_a;
};
uint32_t Client::default_a = 42;
class Owner {
public:
Owner(const uint32_t a) : m_a(a) {}
uint32_t get_a() const { return m_a; }
void set_client_reference(Client* p_client) {
p_client->set_a(m_a);
}
void update() {
const uint32_t old_a = m_a;
m_a += 1;
std::cout << "m_a updated from " << old_a << " to " << m_a << std::endl;
}
private:
uint32_t m_a;
};
int main() {
Client client;
Owner owner(100);
owner.set_client_reference(&client);
for (uint32_t i = 0; i < 3; ++i) {
owner.update();
std::cout << " owner a: " << owner.get_a() << std::endl;
std::cout << " client a: " << client.get_a() << std::endl << std::endl;
}
return 0;
}
这是输出,表明客户端实例中的引用在设置后永远不会更新:
Updating mr_a from 42 to 100
m_a updated from 100 to 101
owner a: 101
client a: 100
m_a updated from 101 to 102
owner a: 102
client a: 100
m_a updated from 102 to 103
owner a: 103
client a: 100
我已经尝试过成员变量的私有访问,发现这不会导致问题。我尝试将访问权限更改为公开,但问题仍然存在。
我考虑过使用指针(Client 持有一个指向 Owner 的成员变量的指针)来解决这个问题,但我不想允许 Client 内的成员变量可能无效。我非常喜欢在这种情况下使用参考。
这是怎么回事?我需要重新学习参考文献工作原理吗?
类
mr_a
的数据成员 Client
设置为引用静态数据成员 default_a;
Client() : mr_a(default_a) {}
//...
static uint32_t default_a;
静态数据成员
default_a
的值在main
内不会更改。