You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

问题分析

  1. 变量复用导致状态统一错误:使用全局的fullOccupied字符串变量存储状态,输出两个建筑时复用该变量,导致Full?结果完全一致,与各自实际状态无关。
  2. 局部bool变量与对象状态脱节:新建的局部bool fullyOccupied变量直接赋值0/1或字符串,完全未关联myBuilding1和myBuilding2的实际状态,判断逻辑无效。
  3. 类设计不合理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:50:46