如何在其他类中访问并存储main函数中定义的类实例
问题原因分析
你现有代码的核心问题是main函数中定义的Foo a是局部变量,作用域仅局限在main函数内部,Bar类的作用域下完全无法访问到这个变量,所以直接在Bar的构造函数里写copy = a必然会编译报错。同时你提供的原始代码还有两处基础语法错误:构造函数内的赋值语句末尾缺分号,类定义结束后也需要加分号。
可行实现方案
方案1:构造函数传参存储副本(最常用,耦合度低)
如果需要在Bar中独立保存一份Foo实例的拷贝,后续修改不会影响原main函数中的a,可以给Bar加带Foo参数的构造函数:
// 先修正Foo的语法错误 class Foo { public: Foo(){x=5;} private: int x; }; class Bar{ public: // 用构造函数初始化列表给copy成员赋值,效率更高 Bar(const Foo& a) : copy(a) {} private: Foo copy; }; int main(){ Foo a; Bar b(a); // 实例化Bar时把a作为参数传入 return 0; }
方案2:存储引用/指针,和原实例保持同步
如果需要修改Bar中存储的Foo实例时,同步修改main里的原a,可以用引用或指针存储:
class Bar{ public: Bar(Foo& a) : ref(a) {} private: Foo& ref; // 引用必须在构造函数的初始化列表中完成赋值,不能后续单独赋值 };
注意:使用该方案需要保证原Foo实例a的生命周期长于Bar实例,否则会出现引用悬空的野访问问题。
方案3:全局单例(仅适合全局唯一Foo实例的场景)
如果所有Bar实例都需要访问同一个全局的Foo实例,可以把Foo封装为单例模式,不过该方案耦合度较高,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者unity123
相关产品推荐
相关产品推荐

