Инициализация объектов на лету
У меня есть вектор под названием 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);