C++中通过双重指针访问结构体成员报错问题求助
C++指针访问错误修复方案
核心语法错误解决
你报错的*(ptrParticle[nParticles_])->Charge = charge;是典型的指针访问语法误用:
ptrParticle[nParticles_]是Particle*类型的指针,->Charge已经是直接访问该指针指向对象的Charge成员,结果是int类型- 前面再加
*相当于对int值解引用,这就触发了"operand of '*' must be a pointer but has type 'int'"错误
直接改成两种正确写法之一即可:
// 推荐:用->直接访问指针成员 ptrParticle[nParticles_]->Charge = charge; ptrParticle[nParticles_]->P_x = px; // 或者:先解引用指针得到对象,再用.访问 (*ptrParticle[nParticles_]).Charge = charge; (*ptrParticle[nParticles_]).P_x = px;
其他必须修复的问题
1. 指针类型不匹配
你定义了typedef const Particle* part_ptr;,但ptrParticle声明为part_ptr*(即const Particle**),而构造函数中new Particle*[max]返回的是Particle**,两者类型不兼容(const修饰的指针不能隐式转换为非const)。
修复:把private里的ptrParticle类型改成Particle**,这样内部可以修改粒子,外部通过part_ptr获取时会自动转为const Particle*,符合你设计的只读接口需求:
// 头文件private段修改 Particle** ptrParticle;
2. 成员变量未初始化
构造函数中没有初始化nParticles_,会导致初始值为随机垃圾值,可能触发错误的粒子数量判断。在构造函数初始化列表中添加:
Event::Event( int n, float x, float y, float z ): evNumber(n), x_(x), y_(y), z_(z), nParticles_(0) { // 初始化nParticles_为0 ptrParticle = new Particle*[max]; }
3. 析构函数内存泄漏
当前析构函数只删除了指针数组,没有删除每个new Particle创建的对象,而且循环用max会访问未初始化的指针。修改析构函数:
Event::~Event() { // 只删除实际添加的粒子 for (int i = 0; i < nParticles_; i++) { delete ptrParticle[i]; // 单个对象用delete,不是delete[] } // 删除指针数组 delete[] ptrParticle; }
4. 补充成员赋值与边界检查
add方法中要补上P_y和P_z的赋值,另外particle方法要加越界检查,避免访问无效指针:
// add方法补充赋值 ptrParticle[nParticles_]->P_y = py; ptrParticle[nParticles_]->P_z = pz; // particle方法实现 Event::part_ptr Event::particle( unsigned int i ) const { if (i < static_cast<unsigned int>(nParticles_)) { return ptrParticle[i]; } return nullptr; // 越界返回空指针 }
修复后完整代码
头文件
#ifndef Event_h #define Event_h class Event { public: Event( int n, float x, float y, float z ); ~Event(); struct Particle { int Charge; float P_x, P_y, P_z; }; typedef const Particle* part_ptr; void add( int charge, float px, float py, float pz ); int eventNumber() const; float x() const; float y() const; float z() const; int nParticles() const; part_ptr particle( unsigned int i ) const; private: int evNumber; int nParticles_; float x_, y_, z_; static const int max=10; Particle** ptrParticle; }; #endif
实现文件
#include "Event.h" Event::Event( int n, float x, float y, float z ): evNumber(n), x_(x), y_(y), z_(z), nParticles_(0) { ptrParticle = new Particle*[max]; } Event::~Event() { for (int i = 0; i < nParticles_; i++) { delete ptrParticle[i]; } delete[] ptrParticle; } void Event::add( int charge, float px, float py, float pz ) { if(nParticles_ < max) { ptrParticle[nParticles_] = new Particle; ptrParticle[nParticles_]->Charge = charge; ptrParticle[nParticles_]->P_x = px; ptrParticle[nParticles_]->P_y = py; ptrParticle[nParticles_]->P_z = pz; ++nParticles_; } } int Event::eventNumber() const { return evNumber; } float Event::x() const { return x_; } float Event::y() const { return y_; } float Event::z() const { return z_; } int Event::nParticles() const { return nParticles_; } Event::part_ptr Event::particle( unsigned int i ) const { if (i < static_cast<unsigned int>(nParticles_)) { return ptrParticle[i]; } return nullptr; }
内容的提问来源于stack exchange,提问作者Silver
相关产品推荐
相关产品推荐

