C++构造析构函数调用疑问及车票预订系统超员转班逻辑求助
现有代码问题梳理
- 业务概念混淆:BUS类对应单个巴士班次,每个班次最多可售卖100张票,而非每售卖1张票就创建1个BUS实例,你当前在BUS构造函数中执行计数的逻辑完全不符合业务场景。
- 成员变量逻辑错误:capacity是BUS类的实例成员,每个新建的BUS对象初始值都为0,构造函数中判断
capacity == 100永远不会触发,没有实际作用。 - 无多班次调度逻辑:当前代码仅实现了单班次满员提示,没有管理多个班次、自动分配下一班的调度层,自然无法实现需求。
- 关于构造函数内调用析构的疑问:C++中禁止在构造函数内主动调用析构函数,属于未定义行为。构造阶段对象还未完成初始化,此时调用析构会销毁未初始化完成的资源,后续使用对象会直接触发崩溃、内存损坏等问题,如果构造过程中出现异常需要终止对象创建,应该抛出异常而非主动调用析构。
功能实现思路
1. 修正单班次预订限制逻辑
首先拆分BUS类的容量相关变量,区分固定最大核载和已售票数,修改单班次的预订判断逻辑:
#include<iostream> #include<vector> using namespace std; class BUS { const int MAX_CAPACITY = 100; // 单班次固定最大核载 int SOD = 6; int EOD = 22; int sold_tickets = 0; // 已售票数,替代原有的capacity int BUS_NO; public: BUS(int no) :BUS_NO(no) {} int bus_No() { return BUS_NO; } // 判断班次是否满员 bool isFull() { return sold_tickets >= MAX_CAPACITY; } // 预订方法返回是否成功 bool reserveTicket() { if (isFull()) { return false; } sold_tickets++; return true; } void routes() { cout << "=========================================\n"; cout << "1.Saddar " << "2.Marrir Chowk\n"; cout << "3.Liaquat Bagh " << "4.Committe Chowk\n"; cout << "5.waris Chowk " << "6.Chandni Chowk\n"; cout << "7.Rehman " << "8.6th Road\n"; cout << "9.Shamsabad " << "10.Faizabad\n"; cout << "11.Pothar " << "12.Khayan e Johar\n"; cout << "13.Faiz Ahmad Road " << "14.Kashmir Highway\n"; cout << "15.Chaman " << "16.Ibn e Sina\n"; cout << "=========================================\n"; } };
2. 新增调度层实现自动分配下一班
新增巴士调度类,管理所有运营班次,对外提供统一的预订入口,遍历现有班次找有空位的班次分配,所有班次满员时自动创建新班次:
class BusSystem { private: vector<BUS> bus_list; int next_bus_no = 1; // 下一个要创建的班次编号 public: BusSystem() { // 初始化时先创建第一班巴士 bus_list.emplace_back(next_bus_no++); } // 统一预订接口,返回预订成功的班次号 int reserve() { // 优先分配已有班次的空位 for (auto& bus : bus_list) { if (!bus.isFull()) { bus.reserveTicket(); return bus.bus_No(); } } // 所有班次满员,创建新班次分配 BUS new_bus(next_bus_no++); new_bus.reserveTicket(); bus_list.push_back(new_bus); return new_bus.bus_No(); } // 可选:根据班次号获取班次对象 BUS* getBusByNo(int no) { for (auto& bus : bus_list) { if (bus.bus_No() == no) { return &bus; } } return nullptr; } };
3. 业务调用示例
class PASSENG { // 可补充乘客id、姓名、预订班次号等成员 }; int main() { BusSystem sys; // 模拟250次预订,会自动分配到1、2、3三个班次 for (int i = 0; i < 250; i++) { int allocated_bus = sys.reserve(); cout << "第" << i+1 << "次预订成功,分配班次:" << allocated_bus << endl; } return 0; }
内容的提问来源于stack exchange,提问作者user15294548
相关产品推荐
相关产品推荐

