输入三角形底和高后面积始终返回0的C++代码问题排查
问题排查与修复方案
核心问题:整数除法导致计算结果为0
在TRIANGLE的CALC_AREA方法中,1 / 2是整数除法——C++里两个整数相除会直接舍去小数部分,结果为0。后续乘以BASE * HEIGHT自然得到0,最终返回值必然是0。
修复方法:把其中一个数改为浮点数,触发浮点除法:
double TEMP = 1.0 / 2 * (BASE * HEIGHT); // 或者直接写 0.5 * BASE * HEIGHT,运算效率更高
其他潜在问题修复
- 私有继承隐患
TRIANGLE继承BASIC_SHAPE时未指定继承方式,C++默认是私有继承,这会导致基类的公有成员在派生类中变为私有,后续若想用基类指针指向派生类对象会直接报错。改成公有继承:
class TRIANGLE: public BASIC_SHAPE
冗余变量重名
你在全局作用域定义了CIRCLE SHAPE2和TRIANGLE SHAPE3,但main函数内又定义了同名局部变量,全局变量会被完全隐藏,属于冗余代码,建议直接删除全局的两个变量。构造函数初始化优化
CIRCLE的构造函数可以改用成员初始化列表,和TRIANGLE保持一致,代码更规范:
CIRCLE() : RADIUS(0) {} CIRCLE(double _RADIUS) : RADIUS(_RADIUS) {}
main函数返回值合规性
C++标准要求main函数必须返回int类型,void main属于未定义行为,修改为:
int main() { // 原有代码 return 0; }
- 内存泄漏修复
main函数中用new创建了LEAD1指针,但未释放内存,需添加delete语句:
delete LEAD1;
修复后的完整TRIANGLE类代码
class TRIANGLE: public BASIC_SHAPE { public: TRIANGLE() : BASE(0), HEIGHT(0) {} TRIANGLE(double _BASE , double _HEIGHT) : BASE{_BASE}, HEIGHT{_HEIGHT} {} virtual double CALC_AREA() override { // 加override关键字明确重写基类方法 double TEMP = 0.5 * BASE * HEIGHT; return GET_AREA(TEMP); } private: double BASE, HEIGHT; };
内容的提问来源于stack exchange,提问作者Kobrakixx
相关产品推荐
相关产品推荐

