如何让B类指针指向C类中同一个A类实例?
问题分析与解决方案
原代码的核心问题
- 未初始化指针的非法解引用:B类的
a指针在构造函数中未初始化就调用a->getP(a),属于未定义行为,会导致内存访问错误或随机值输出。 - 指针传值无效:A类的
getP函数采用传值传递指针,函数内修改的只是形参ptr的副本,不会改变B类成员a的实际指向。 - 对象构造顺序的限制:C类中成员的构造顺序是先
A a、再B b,最后执行C的构造函数体。原代码中B构造时没有渠道获取到同一C实例中A的地址。
修正方案:通过构造函数传递指针
最直接的解决方式是给B类添加带参数的构造函数,在C类初始化B时,将自身的A成员地址传递给B,让B的指针直接指向该A实例。
修正后的代码
#include <stdio.h> class A { public: int x; A() : x(0) { // 初始化x避免随机值干扰测试 printf("From A, x=%d\n", x); } }; class B { public: A *a; // 带参数的构造函数,直接初始化指针 B(A* ptr) : a(ptr) {} void test() { printf("From test(), x=%d\n", a->x); } }; class C { public: A a; B b; // 在初始化列表中,将A的地址传递给B的构造函数 C() : b(&a) { a.x = 55; printf("From C, x=%d\n", a.x); b.test(); } }; int main () { C c; return 0; }
代码说明
- B类新增带参构造函数,通过初始化列表直接将传入的A指针赋值给成员
a,彻底避免未初始化问题。 - C类的初始化列表中,利用
b(&a)将自身的A成员地址传递给B,确保B的指针指向同一C实例中的A对象。 - 给A的构造函数添加
x(0)初始化,避免未初始化的随机值影响测试结果。
运行输出
From A, x=0 From C, x=55 From test(), x=55
内容的提问来源于stack exchange,提问作者Caty
相关产品推荐
相关产品推荐

