通过引用传递对象并存储为成员变量:如何让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
相关产品推荐
相关产品推荐

