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

如何让B类指针指向C类中同一个A类实例?

问题分析与解决方案

原代码的核心问题

  1. 未初始化指针的非法解引用:B类的a指针在构造函数中未初始化就调用a->getP(a),属于未定义行为,会导致内存访问错误或随机值输出。
  2. 指针传值无效:A类的getP函数采用传值传递指针,函数内修改的只是形参ptr的副本,不会改变B类成员a的实际指向。
  3. 对象构造顺序的限制: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:52:28