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

C++中如何更新指针成员变量?代码问题求助

问题根源

你的B::getPtr(int idx)返回的是arr[idx].X的指针副本,而非原指针的引用。当你在main中调用b.getPtr(index)时,得到的是一个临时的指针值,将其传入setPtr的C*& oldPtr参数时,修改的只是这个临时副本,而非结构体D中真正的X指针,所以调用后原X依然是nullptr。

解决方案

有几种简单的修复方式,选最适合你的即可:

方案1:让getPtr返回指针引用

修改B类的getPtr函数,使其返回原指针的引用,这样直接操作的就是结构体里的X:

class B {
public:
    // ... 其他代码
    C*& getPtr(int idx) { // 返回C*的引用
        return arr[idx].X;
    }
    // 甚至可以删掉setPtr,直接在main里赋值
};

// main中直接赋值:
b.getPtr(index) = a.getPointer(dat);

如果想保留setPtr,也可以继续用,但此时传入的是原指针的引用,修改会生效:

// main中调用
b.setPtr(b.getPtr(index), a.getPointer(dat));

方案2:给B类添加直接设置X的函数

在B类中新增一个专门设置指定索引X指针的函数,直接操作原数组元素,逻辑更清晰还能加边界检查:

class B {
public:
    // ... 其他代码
    void setX(int idx, C* newPtr) {
        // 加边界检查避免越界访问
        if (idx >= 0 && idx < size) {
            arr[idx].X = newPtr;
        }
    }
};

// main中调用:
b.setX(index, a.getPointer(dat));

额外注意点

  1. 你A::getPointer(int dat)函数里写的return getPointer(dat);是无限递归,会导致程序崩溃,记得替换成实际的内部查找函数(比如return internalGetPointer(dat);)。
  2. A类的insert函数每次new C都会覆盖成员变量c,如果没有管理旧对象的内存,会造成内存泄漏,确保你的析构函数或内部逻辑处理了这部分。

内容的提问来源于stack exchange,提问作者Marg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:50:31