即时初始化对象

时间:2010-04-03 12:21:17

标签: c++ function object reference-parameters

我有一个名为player的向量和一个名为Player的类。我要做的是写:

players.push_back(Player(name, Weapon(bullets)));

所以我希望能够在循环中创建玩家。但我看到一条错误消息说“没有匹配函数调用Player :: Player ...”

然后我把它改为:

Weapon w(bullets);
Player p(name, w);
players.push_back(p);

这是我的播放器定义:

class Player {
public:
   Player(string &name, Weapon &weapon);
private
   string name;
   Weapon weapon;
}

我只是想了解这些定义之间的区别。这是将对象传递给对象构造函数的正确方法。

注意:这些不是我的实际类定义。我只是想通过编码来学习C ++中面向对象编程的一些东西。我的意思是我知道可以在播放器中初始化武器:)

2 个答案:

答案 0 :(得分:4)

将构造函数更改为:

Player(const string &name, const Weapon &weapon);

或:

Player(const string &name, Weapon weapon);

使用临时对象初始化引用是无效的C ++,这是您在使用时所做的事情:

Player(name, Weapon(bullets));

尽管使用const引用是合法的。

编辑:您还应将名称作为const引用或按值传递。

答案 1 :(得分:1)

您正在将临时(Weapon(bullets))传递给Player构造函数,该构造函数需要Weapon &。但由于你不允许引用临时文件,因此失败了。

但是,您可以对临时内容进行 const 引用。因此,重新声明您的构造函数如下:

   Player(string const &name, Weapon const &weapon);