如何在C++中让f类成员函数访问所属c类实例的成员变量
解决f类访问所属c类实例成员的问题
这其实是个典型的父子对象关联问题,最干净的解决方案就是给f类添加一个指向所属c实例的指针,在c创建内部的f实例时完成关联,完全符合你提出的所有限制条件。
具体实现步骤
- 给
f类添加私有成员指针c* parent;,用来记录它所属的c实例 - 修改
f的构造函数,让它接受一个c*类型的参数,用来初始化parent - 在
c的构造函数里,遍历内部的allMyFs数组,把每个f实例的parent指向当前c实例(也就是this指针) - 在
f::testMethod()里,直接通过parent->myInt访问所属c实例的成员
修改后的完整代码
class c; // 前向声明,让f提前知晓c的存在 class f { public: // 修改构造函数,传入所属c实例的指针 f(c* p) : parent(p) {}; int testMethod() { // 安全访问所属c实例的myInt,同时处理无关联的情况 if (parent != nullptr) { return parent->myInt; } // 针对单独创建的f实例,返回一个默认值或做异常处理 return -1; } private: c* parent; // 记录当前f所属的c实例 }; class c { public: c(){ // 初始化内部的f数组,把当前c实例的指针传给每个f for (int i = 0; i < 3; ++i) { allMyFs[i] = f(this); } }; int myInt = 15; // 新增一个成员函数,用来测试内部f实例的访问(因为allMyFs是私有成员) int testFInstance(int idx) { if (idx >=0 && idx <3) { return allMyFs[idx].testMethod(); } return -1; } private: f allMyFs[3]; }; int main() { c instanceOfC; // 测试c内部的f实例,会返回15 cout << instanceOfC.testFInstance(0) << endl; // 单独创建的f实例,因为没有关联c,会返回-1 f instanceOfF(nullptr); cout << instanceOfF.testMethod() << endl; }
为什么这个方案符合要求
- 没有使用
extern:完全不需要全局变量或外部声明,关联关系仅存在于对象内部 myInt无需设为static:每个c实例的myInt都是独立的,f实例只会访问自己所属的那个c实例的成员- 调用
testMethod()时无需传递c的引用/指针:关联关系在对象构造时就已建立,后续调用无需额外参数
额外提醒:如果存在单独创建的f实例(比如main里的instanceOfF),一定要处理parent为空的情况,避免空指针异常。
内容的提问来源于stack exchange,提问作者alve89
相关产品推荐
相关产品推荐

