C++构造函数及重载构造函数中布尔值功能异常求助
C++项目中建筑全满状态判断逻辑失效问题排查
问题背景
正在完成一个校园C++项目,要求使用类、构造函数和重载构造函数生成指定输出。目前其他功能均正常,但用于判断建筑是否全满的bool值逻辑失效,输出的Full?字段不符合预期。
预期输出
Year 2020: Building 1 has 10 floors, 20 apartments, and is 100% occupied. Full? true Building 2 has 30 floors, 30 apartments, and is 75% occupied. Full? false Many years pass. Year 2043: Building 1 has 10 floors, 20 apartments, and is 0% occupied. Full? false Building 2 has 30 floors, 30 apartments, and is 100% occupied. Full? true Looks like people prefer taller buildings.
现有代码片段
myBuilding1.setfullyOccupied(1); myBuilding2.setfullyOccupied(0); string fullOccupied; if (bool fullyOccupied = 0) { fullOccupied = "false"; } else if (bool fullyOccupied = 1) { fullOccupied = "true"; } cout << "Year 2020: " << endl; cout << "Building 1 has " << myBuilding1.getStories() << " floors, " << myBuilding1.getApartments() << " apartments, and it " << percento << "% occupied. Full? " << /*myBuilding1.getfullyOccupied()*/ fullOccupied << endl; cout << "Building 2 has " << myBuilding2.getStories() << " floors, " << myBuilding2.getApartments() << " apartments, and it " << percentt << "% occupied. Full? " << /*myBuilding2.getfullyOccupied()*/ fullOccupied << endl; cout << "\nMany years pass." << "\n\nYear 2043: " << endl; myBuilding1.setOccupancy(0.0); myBuilding2.setOccupancy(1.0); myBuilding1.setfullyOccupied("false"); myBuilding2.setfullyOccupied("true"); if (bool fullyOccupied = "false") { fullOccupied = "false"; } else if (bool fullyOccupied = "true") { fullOccupied = "true"; } float percentto = myBuilding1.getOccupancy() * 100; float percenttt = myBuilding2.getOccupancy() * 100; cout << "Building 1 has " << myBuilding1.getStories() << " floors, " << myBuilding1.getApartments() << " apartments, and is " << percentto << "% occupied. Full? " << fullOccupied << endl; cout << "Building 2 has " << myBuilding2.getStories() << " floors, " << myBuilding2.getApartments() << " apartments, and is " << percenttt << "% occupied. Full? " << fullOccupied << endl; cout << "Looks like people prefer taller buildings." << endl; }
实际错误输出
Year 2020: Building 1 has 10 floors, 20 apartments, and it 100% occupied. Full? true Building 2 has 30 floors, 30 apartments, and it 75% occupied. Full? true Many years pass. Year 2043: Building 1 has 10 floors, 20 apartments, and is 0% occupied. Full? false Building 2 has 30 floors, 30 apartments, and is 100% occupied. Full? false Looks like people prefer taller buildings.
问题分析
- 变量复用导致状态统一错误:使用全局的
fullOccupied字符串变量存储状态,输出两个建筑时复用该变量,导致Full?结果完全一致,与各自实际状态无关。 - 局部bool变量与对象状态脱节:新建的局部
bool fullyOccupied变量直接赋值0/1或字符串,完全未关联myBuilding1和myBuilding2的实际状态,判断逻辑无效。 - 类设计不合理:
setfullyOccupied函数同时接受int和string类型参数,易引发类型混乱;单独存储fullyOccupied状态,易与occupancy值产生不一致(如修改了occupancy但未同步fullyOccupied)。
解决方案
优化类设计
移除单独的fullyOccupied成员变量,通过occupancy值实时计算是否全满,避免状态不一致:
class Building { private: int stories; int apartments; double occupancy; // 范围0.0~1.0,表示占用比例 public: // 构造函数、重载构造函数及其他成员函数实现 double getOccupancy() const { return occupancy; } void setOccupancy(double occ) { occupancy = occ; } int getStories() const { return stories; } int getApartments() const { return apartments; } // 实时判断是否全满(考虑浮点数精度) bool isFullyOccupied() const { return (occupancy >= 1.0 - 1e-9); } };
修正主函数逻辑
直接调用对象的isFullyOccupied()方法获取状态,用boolalpha让cout输出"true"/"false":
cout << "Year 2020: " << endl; // 假设percento和percentt是预先计算好的占用百分比 cout << "Building 1 has " << myBuilding1.getStories() << " floors, " << myBuilding1.getApartments() << " apartments, and is " << percento << "% occupied. Full? " << boolalpha << myBuilding1.isFullyOccupied() << endl; cout << "Building 2 has " << myBuilding2.getStories() << " floors, " << myBuilding2.getApartments() << " apartments, and is " << percentt << "% occupied. Full? " << boolalpha << myBuilding2.isFullyOccupied() << endl; cout << "\nMany years pass.\n\nYear 2043: " << endl; myBuilding1.setOccupancy(0.0); myBuilding2.setOccupancy(1.0); float percentto = myBuilding1.getOccupancy() * 100; float percenttt = myBuilding2.getOccupancy() * 100; cout << "Building 1 has " << myBuilding1.getStories() << " floors, " << myBuilding1.getApartments() << " apartments, and is " << percentto << "% occupied. Full? " << boolalpha << myBuilding1.isFullyOccupied() << endl; cout << "Building 2 has " << myBuilding2.getStories() << " floors, " << myBuilding2.getApartments() << " apartments, and is " << percenttt << "% occupied. Full? " << boolalpha << myBuilding2.isFullyOccupied() << endl; cout << "Looks like people prefer taller buildings." << endl;
关键修正点
- 去掉手动设置
fullyOccupied的逻辑,通过occupancy实时计算,避免状态不同步。 - 每个建筑的
Full?状态直接调用自身的isFullyOccupied()方法,确保结果对应各自状态。 - 使用
boolalpha操纵符让cout输出bool值为"true"/"false",无需手动转换字符串。
内容的提问来源于stack exchange,提问作者TagUrIT
相关产品推荐
相关产品推荐

