【问题标题】:Initializing objects on the fly动态初始化对象
【发布时间】:2010-04-03 12:21:16
【问题描述】:

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

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

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

然后我将其更改为:

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

这是我的 Player 定义:

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

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

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

【问题讨论】:

    标签: c++ function object reference-parameters


    【解决方案1】:

    将构造函数更改为:

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

    或:

    Player(const string &name, Weapon weapon);
    

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

    Player(name, Weapon(bullets));
    

    虽然使用const 引用是合法的。

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

    【讨论】:

    • 名称也应该是 const(它是在构造函数内部被复制而不是修改)
    • @Andreas:顺便说一句,上面这两个代码有什么区别吗?我说的是表演。他们都在创建一个局部变量并通过对吗?
    • @pocoa 第一个通过引用传递参数weapon,它本质上是一个指针。第二个通过值传递参数,这意味着weapon 的副本被传递给构造函数。如果Weapon 类的大小大于指针的大小,则通常通过引用传递更快。
    • @Andreas:对不起,我的解释很糟糕。我在谈论我的代码。第一个是 player.push_back(Player(name, Weapon(bullets))) 另一个是 3 行,它创建 Weapon 并分配给 Player,然后将 Player 添加到向量中。他们是一样的吗?感谢您的宝贵时间。
    • @pocoa:如果我们暂时假装您的错误代码编译并做了显而易见的事情,即对临时对象进行非常量引用,那么是的,它可能与您的相同有效的代码。临时对象在实际行为中与自动变量没有太大区别,它们只是由编译器秘密创建和销毁。理论上,编译器可以对它们做一些特殊的事情,以利用它们只能通过 const 引用传递的事实,但实际上并没有那么多。您可以临时调用非 const 成员 fn:它们不是“真正的 const”。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多