2010-04-03 175 views
1

我有一个叫做播放器的载体和一个叫做播放器的类。我试图做的是写:正在初始化对象

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

所以我想能够创建循环播放器。但是,我看到一个错误信息说“呼叫播放::播放器没有匹配的功能......”

然后我改变了对:

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++中学习一些关于面向对象编程的知识。我的意思是我知道的武器可以在播放器初始化:)

回答

4

更改构造函数:

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

或:

Player(const string &name, Weapon weapon); 

这不是有效的C++来初始化临时对象的引用,这是你在使用时所要做的:

Player(name, Weapon(bullets)); 

使用是合法的参考。

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

+1

的名字也应该是const(它被复制,并在构造函数中没有被修改) – 2010-04-03 12:34:27

+0

@大卫你是绝对正确的。 – 2010-04-03 12:35:51

+0

@Andreas:顺便说一句,上面这两个代码有没有区别?我在谈论表现。他们两个正在创建一个局部变量并传递正确? – pocoa 2010-04-03 12:43:50

1

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

但是,您可以使const引用临时。因此,重新声明构造函数如下:

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