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));
额外注意点
- 你
A::getPointer(int dat)函数里写的return getPointer(dat);是无限递归,会导致程序崩溃,记得替换成实际的内部查找函数(比如return internalGetPointer(dat);)。 A类的insert函数每次new C都会覆盖成员变量c,如果没有管理旧对象的内存,会造成内存泄漏,确保你的析构函数或内部逻辑处理了这部分。
内容的提问来源于stack exchange,提问作者Marg
相关产品推荐
相关产品推荐

