C++将字符串传递给构造函数只是传递"",除非明确修改

Scr*_*tty 0 c++

我有这个班的人

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++有点陌生.对不起,如果这是一个愚蠢的错误.我已经完成并提交了程序,我只是不知道为什么没有支架的构造函数不起作用.

如果这复制给你,请告诉我.

Man*_*rse 6

问题是你的构造函数是不正确的.

内:

people(string name, int newb) {
    name = name;
    balance = newb;
}
Run Code Online (Sandbox Code Playgroud)

name是指参数name,而不是类数据成员name.

为了解决这个问题,无论是有资格namethis,或直接构造名和平衡,而非默认构造它们,然后分配给他们:

//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)