Инициализация объектов на лету - PullRequest
2 голосов
/ 03 апреля 2010

У меня есть вектор под названием 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 ]

4 голосов
/ 03 апреля 2010

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

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

или

Player(const string &name, Weapon weapon);

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

Player(name, Weapon(bullets));

допустимо использовать ссылку const.

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

1 голос
/ 03 апреля 2010

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

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

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