C++ Booking模板类代码运行时儿童姓名输出出现异常拼接问题
问题触发原因
- 核心直接原因:输出姓名时错误拼接了冗余值。你在输出成人/儿童姓名的代码中,同时打印了数组存储的姓名
a[i]/c[j]和obj2对象存储的姓名,而obj2只能存储单组成人+儿童姓名,循环赋值后最终存储的是最后一名儿童的姓名z,所以每个儿童姓名都会和z拼接,出现xz/yz/zz的异常输出。 - 次要逻辑错误:
- 变量
j未初始化就被使用:在成人输入的循环中调用obj2.setData(a[i],c[j])时,j还未赋值,属于未定义行为。 - 数组越界访问风险:成人输入循环结束后
i的值为a1,在儿童输入循环中调用obj2.setData(a[i],c[j])时,a[i]访问了a数组的越界位置,读取到无效值。 - 模板类对象使用不符合预期:
Booking<string, string>类型的obj2仅能存储单组姓名,你试图用它存储所有用户姓名的逻辑本身不成立。
- 变量
修复方案
以下为最小改动方案,保留原有代码结构仅修正错误逻辑:
#include<iostream> using namespace std; template <typename A, typename C> class Booking { private: A adult; C child; public: void setData(A x, C y) { adult = x; child = y; } A getAdultData() { return adult; } C getChildData() { return child; } }; int main() { int a1,c1; string a[10]; string c[10]; Booking <int, int> obj1; cout<< "Enter the number of Adult : "; cin>>a1; cout<< "Enter the number of Child : "; cin>>c1; obj1.setData(a1,c1); cout<<"Name atleast one of the Adult and a Child"<<endl; // 输入成人姓名,移除无意义的obj2操作 for(int i=0;i<a1;i++) { cout<< "Adult name : "; cin>>a[i]; } // 输入儿童姓名,移除无意义的obj2操作 for(int j=0;j<c1;j++) { cout<< "Child name : "; cin>>c[j]; } cout<<"Number of Adult Customers : "<<obj1.getAdultData()<<endl; cout<<"Number of Child Customers : "<<obj1.getChildData()<<endl; // 输出时移除obj2的冗余拼接 for(int i=0;i<a1;i++) { cout<<"Name of Adult "<<i+1<<" : "<<a[i]<<endl; } for(int j=0;j<c1;j++) { cout<<"Name of Child "<<j+1<<" : "<<c[j]<<endl; } return 0; }
优化建议
- 替换固定长度的字符串数组为
vector<string>,避免人数超过10时的数组越界问题。 - 如果需要用模板类存储所有姓名,可以声明
Booking<string, string>类型的数组/vector,每个对象存储一组成人+儿童的绑定信息,适配业务需求。
内容的提问来源于stack exchange,提问作者Anish Dalvi
相关产品推荐
相关产品推荐

