Инициализация объектов на лету

У меня есть вектор под названием Players и класс 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++ с его кодированием. Я имею в виду, я знаю, что оружие может быть инициализировано в Player:)

2 ответа

Решение

Измените конструктор на:

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

или же:

Player(const string &name, Weapon weapon);

Недопустимо в C++ инициализировать ссылку временным объектом, что вы и делаете, когда используете:

Player(name, Weapon(bullets));

законно использовать const Ссылка хотя.

РЕДАКТИРОВАТЬ: Вы также должны передать имя как const ссылка или по значению.

Вы проходите временный (Weapon(bullets)) к Player конструктор, который принимает Weapon &, Но так как вам не разрешено делать ссылки на временные ссылки, это не удается.

Вам, однако, разрешено делать постоянные ссылки на временные. Таким образом, переопределите ваш конструктор следующим образом:

   Player(string const &name, Weapon const &weapon);
Другие вопросы по тегам