C++实现ShowTickets类单条件判断致双票状态异常问题
C++剧院售票系统座位状态异常排查
问题现象
移除main函数中的if语句时,查询AA排101、102座的票务状态均显示为可售;但仅针对AA排101座添加if判断执行售票操作后,两个座位的票务均显示为已售。
题目需求
某剧院需开发演出座位售票状态跟踪系统,要求定义名为ShowTickets的类:
- 类内需包含用于存储排号、座位号、对应售票状态的集合字段,仅需支持最多10张已售票的记录存储,未被录入过的票务默认售票状态为false(未售);
- 需实现以下成员函数:
bool is_sold(string row, string seat):查询指定排、指定座位的票是否已售出;void sell_seat(string row, string seat):将指定排、指定座位的票状态更新为已售;string print_ticket(string row, string seat):以空格为分隔符,返回包含排号、座位号、售票状态的字符串。
问题根因
原代码存在3处核心逻辑错误:
- 存储结构设计不符合要求:类中只定义了单个
Row、Seat、sold字段,没有使用集合结构存储多座位的独立状态,整个对象只能保存一个通用的售票标记,根本无法区分不同座位的状态,也满足不了最多存储10条已售记录的要求。 - 成员函数完全忽略传入参数:
is_sold、sell_seat、print_ticket三个函数虽然接收了排号、座位号入参,但逻辑中完全没有使用这些参数做匹配:is_sold无论传入什么座位,都直接返回唯一的sold变量值;sell_seat无论传入什么座位,都直接把sold设为true。这就直接导致只要售出任意一个座位,所有座位查询都会返回已售状态。 - 构造函数存在冗余无效代码:构造函数中声明的局部
row、seat变量未初始化就赋值给类成员,属于无意义的冗余逻辑。
修正后代码
#include <iostream> #include <string> using namespace std; class ShowTickets{ private: // 用两个数组分别存储已售座位的排号、座位号,最多支持10条记录 string sold_rows[10]; string sold_seats[10]; int sold_cnt; // 记录当前已售的票数量 public: ShowTickets(){ sold_cnt = 0; } bool is_sold(string row, string seat){ // 遍历已售列表匹配目标座位 for(int i = 0; i < sold_cnt; i++){ if(sold_rows[i] == row && sold_seats[i] == seat){ return true; } } // 未匹配到则为未售状态 return false; } void sell_seat(string row, string seat){ // 座位已售或已达存储上限时直接返回 if(is_sold(row, seat) || sold_cnt >= 10){ return; } sold_rows[sold_cnt] = row; sold_seats[sold_cnt] = seat; sold_cnt++; } string print_ticket(string row, string seat){ string res = row + " " + seat + " "; res += is_sold(row, seat) ? "sold" : "Available"; return res; } }; int main () { ShowTickets myticket; if(!myticket.is_sold("AA","101")) myticket.sell_seat ("AA","101"); cout << myticket.print_ticket("AA","101") << endl; cout << myticket.print_ticket("AA","102") << endl; return 0; }
运行结果
修正后代码运行输出如下,符合预期:
AA 101 sold AA 102 Available
内容的提问来源于stack exchange,提问作者Dandan She
相关产品推荐
相关产品推荐

