当引用变量为

问题描述 投票:0回答:1

我重新创建了我所看到的问题的小示例。

我有两节课。类所有者有一个成员变量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 内的成员变量可能无效。我非常喜欢在这种情况下使用参考。

这是怎么回事?我需要重新学习参考文献工作原理吗?

c++ c++11 reference c++17 pointer-to-member
1个回答
0
投票

mr_a
的数据成员
Client
设置为引用静态数据成员 default_a;

Client() : mr_a(default_a) {}
//...
 static uint32_t default_a;

静态数据成员

default_a
的值在
main
内不会更改。

© www.soinside.com 2019 - 2024. All rights reserved.