C++将已实例化Display类传入Triangle类调用方法出现段错误如何解决
问题根源
你的代码核心问题是变量命名遮蔽:Triangle类构造函数的形参名和类的私有成员变量名都是display,赋值语句display=display实际是把形参自己赋值给形参,类持有的Display*成员变量完全没有被初始化,属于野指针。调用DrawTriangle时通过野指针访问内存自然会触发段错误,也不可能读到原Display对象的成员值。
修复方案
二选一即可:
- 方法1:修改构造函数形参名,避免命名冲突
// triangle.cpp 构造函数修改为如下实现 Triangle::Triangle(Display* input_display) { display = input_display; }
- 方法2:用
this指针明确指定要赋值的是类成员变量
// triangle.cpp 构造函数修改为如下实现 Triangle::Triangle(Display* display) { this->display = display; }
优化建议
- 可以给类成员变量加统一前缀(比如
m_),例如将成员指针命名为m_display,从命名规则层面彻底避免这类遮蔽问题,也方便后续代码维护 - 调用指针前可以增加非空判断,避免空指针访问导致的崩溃问题
内容的提问来源于stack exchange,提问作者Sean Payne
相关产品推荐
相关产品推荐

