我有这个班的人
class people {
public:
string name;
int balance;
people(string name, int newb) {
name = name;
balance = newb;
}
};
Run Code Online (Sandbox Code Playgroud)
我以为我对构造函数有了不错的理解,直到我无法弄清楚为什么这不起作用:
for(int i=0; i<users; i++) {
fin>>temp_name; // !!!!!
givers_list.push_back(temp_name, 0);
}
Run Code Online (Sandbox Code Playgroud)
没有错误,只有在我调试的时候,我有一个用户名为"""且余额= 0的用户向量; 我也100%确定temp_name是一个像"David"这样的字符串
只有当我创建一个临时对象,"cat",构造它,修改它的名字,然后push_back才能正常工作:
for(int i=0; i<users; i++) {
fin>>temp_name; // !!!!!
people cat = people(temp_name, 0);
cat.name = temp_name;
givers_list.push_back(cat);
}
Run Code Online (Sandbox Code Playgroud)
为什么它不是第一次工作?我已经检查了SO和C++论坛,我相信他们做了我做过的事情.奇怪的是,我确定问题是关于一个字符串,因为当我说givers_list.push_back(people(temp_name, 50));,然后该对象将正确地具有50作为平衡(名称仍然是"").
我的背景是从C++开始的,我已经做了很长时间的Java,但回到C++有点陌生.对不起,如果这是一个愚蠢的错误.我已经完成并提交了程序,我只是不知道为什么没有支架的构造函数不起作用.
如果这复制给你,请告诉我.
问题是你的构造函数是不正确的.
内:
people(string name, int newb) {
name = name;
balance = newb;
}
Run Code Online (Sandbox Code Playgroud)
name是指参数name,而不是类数据成员name.
为了解决这个问题,无论是有资格name与this,或直接构造名和平衡,而非默认构造它们,然后分配给他们:
//Option 1:
people(string name, int newb) {
this->name = name;
balance = newb;
}
//Option 2: Preferred; avoids duplicate initialisation.
people(string name, int newb) :
name(name), balance(newb)
{
}
//Option 3: Optimal; avoids unnecessary copies.
people(string name, int newb) :
name(std::move(name)), balance(newb)
{
}
Run Code Online (Sandbox Code Playgroud)