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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:48:01