You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过引用传递对象并存储为成员变量:如何让a与b为同一对象?

解决方案:不用指针让成员变量与外部对象成为同一实体

嘿,我完全理解你想避开指针、直接用实体对象访问的需求——每次解引用确实有点繁琐,咱们来看看几种能满足你要求的方法:

1. 用引用作为类成员变量

这是最直接的方案,引用本身就是对已有对象的别名,完全符合你“让a和b是同一个对象”的需求,而且访问时不用额外操作。

不过要注意:引用成员必须在构造函数的初始化列表中完成初始化,不能在构造函数体内赋值。举个具体的实现例子:

// Gamestate.h
class SomeType {
    // 假设这是你的对象类型,包含你需要的成员和方法
public:
    int value = 0;
    void print() { /* ... */ }
};

class Gamestate {
private:
    SomeType& a; // 声明引用成员
public:
    // 构造函数必须通过初始化列表绑定外部对象
    Gamestate(SomeType& externalObj) : a(externalObj) {}

    // 直接通过a访问对象,无需解引用
    void updateValue(int newVal) {
        a.value = newVal;
    }
};

使用的时候:

// 外部对象b
SomeType b;
b.value = 10;

// 创建Gamestate时绑定b
Gamestate gs(b);

// 现在gs里的a和b是同一个对象,直接访问即可
gs.updateValue(20);
std::cout << b.value; // 输出20,说明两者完全同步

⚠️ 注意:引用成员一旦初始化就无法再绑定到其他对象,如果你的Gamestate需要后期切换绑定的对象,这个方法就不适用了。

2. 用std::reference_wrapper实现可变更的绑定

如果需要后期更换绑定的对象,C++11及以上提供的std::reference_wrapper是更灵活的选择——它本质上是引用的包装器,可以像引用一样使用,同时支持重新绑定新对象。

实现示例:

// Gamestate.h
#include <functional> // 必须包含这个头文件

class SomeType {
public:
    int value = 0;
    void print() { /* ... */ }
};

class Gamestate {
private:
    std::reference_wrapper<SomeType> a;
public:
    // 构造函数初始化绑定
    Gamestate(SomeType& externalObj) : a(externalObj) {}

    // 提供方法更换绑定的对象
    void rebindTo(SomeType& newObj) {
        a = newObj;
    }

    // 直接访问对象,无需解引用
    void printValue() {
        a.get().print(); // 或者直接写a.print(),因为有隐式转换
    }
};

使用的时候:

SomeType b, c;
b.value = 10;
c.value = 20;

Gamestate gs(b);
gs.printValue(); // 输出10

// 后期切换绑定到c
gs.rebindTo(c);
gs.printValue(); // 输出20

这个方案既保留了直接访问的便捷性,又提供了更换绑定对象的灵活性,完美平衡了你的需求。


内容的提问来源于stack exchange,提问作者user9441223

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:13:09