使用stringstream的C++ Student类实现问题求助
问题分析与修复方案:Student类Setter函数赋值失败导致输出异常
核心问题
你的代码里所有Setter函数都犯了同一个错误:参数名和类成员变量名完全相同,导致函数内部的赋值操作只是把参数值赋给自己,根本没修改到类的成员变量。
比如set_age函数里的age = age;,这里的age都是函数的局部参数,类的成员变量age完全没被赋值,始终是默认初始化的垃圾值(int类型);字符串类型的成员变量则是空字符串,这就是为什么你的输出会出现随机垃圾值、空字符串、0这类异常结果。
另外,to_string函数里用了std::endl,会在生成的字符串末尾额外添加换行符,和预期输出不符,需要去掉。
修复后的代码
方案1:修改参数名,与成员变量区分
#include <iostream> #include <sstream> #include <string> class Student{ private: int age; std::string first_name; std::string last_name; int standard; public: void set_age(int a){ age = a; } int get_age(){ return age; } void set_standard(int s){ standard = s; } int get_standard(){ return standard; } void set_first_name(std::string fn){ first_name = fn; } std::string get_first_name(){ return first_name; } void set_last_name(std::string ln){ last_name = ln; } std::string get_last_name(){ return last_name; } std::string to_string(){ std::stringstream os; os << age << "," << first_name << "," << last_name << "," << standard; return os.str(); } }; int main() { int age, standard; std::string first_name, last_name; std::cin >> age >> first_name >> last_name >> standard; Student st; st.set_age(age); st.set_standard(standard); st.set_first_name(first_name); st.set_last_name(last_name); std::cout << st.get_age() << "\n"; std::cout << st.get_last_name() << ", " << st.get_first_name() << "\n"; std::cout << st.get_standard() << "\n"; std::cout << "\n"; std::cout << st.to_string() << "\n"; return 0; }
方案2:使用this指针明确指向成员变量
如果不想修改参数名,可以用this->成员变量的方式,明确指定要修改的是类的成员:
// 以set_age为例,其他Setter函数同理 void set_age(int age){ this->age = age; }
修复后效果
输入示例中的数据后,会输出预期结果:
15 carmack, john 10 15,john,carmack,10
内容的提问来源于stack exchange,提问作者Parke
相关产品推荐
相关产品推荐

