аргументы по умолчанию в конструкторе - PullRequest
2 голосов
/ 28 октября 2009

Могу ли я использовать аргументы по умолчанию в конструкторе, как это возможно

Soldier(int entyID, int hlth = 100, int exp = 10, string nme) : entityID(entyID = globalID++), health(hlth), experience(exp), name(nme = SelectRandomName(exp)) { }

Я хочу, например, exp = 10 по умолчанию, но я могу переопределить это значение, если я предоставлю его в конструкторе, в противном случае оно должно использовать значение по умолчанию.

Как я могу это сделать, я знаю, что мой подход не работает ....

Если я предоставляю какое-либо значение в списке инициализации, независимо от того, что я предоставляю в конструкторе, с другой стороны, он перезаписывается, конечно, всякий раз, когда я предоставляю значение в конструкторе, тогда зачем мне сначала нужно значение по умолчанию, как и каждый раз предоставить значение для инициации объекта ...?

Должен ли я использовать разные перегруженные конструкторы, или у вас есть другие идеи ...?

Ответы [ 5 ]

8 голосов
/ 28 октября 2009

Аргументы по умолчанию могут быть предоставлены только для непрерывного диапазона параметров, который продолжается до конца списка параметров.Проще говоря, вы можете задать аргументы по умолчанию для 1, 2, 3, ... N last параметров функции.Вы не можете предоставить параметры по умолчанию для параметров в середине списка параметров, как вы пытаетесь сделать выше.Либо переставьте параметры (поставьте hlth и exp в конце), либо укажите аргумент по умолчанию для nme.

Кроме того, список инициализатора конструктора, похоже, не имеет никакого смысла.Какой смысл передавать entyID и nme извне, если вы все равно переопределите их значения в списке инициализатора конструктора?

2 голосов
/ 28 октября 2009

Я полагаю, что вы можете сделать это, однако все ваши аргументы по умолчанию должны быть в конце. Итак, в вашем примере подпись конструктора будет

Soldier(int entyID, string nme, int hlth = 100, int exp = 10);
2 голосов
/ 28 октября 2009

Все параметры с аргументами по умолчанию должны быть после любых обязательных аргументов. Вы должны переместить параметр nme до hlth.

1 голос
/ 28 октября 2009

Только концевые аргументы могут быть аргументами по умолчанию. Вам нужно будет задать nme аргумент по умолчанию или изменить порядок аргументов, которые принимает конструктор, чтобы hlth и exp были последними.

Что касается присвоения, которое вы делаете в списке инициализатора, то происходит то, что члену entityID присваивается значение, которое возвращается присваиванием от globalID++ до entyID, что будет значением entyID после назначения. Аналогичная вещь происходит для name.

1 голос
/ 28 октября 2009

Аргументы со значениями по умолчанию должны быть последними аргументами в объявлении функции. Другими словами, не может быть никаких аргументов без значений по умолчанию, следующих за аргументом со значением по умолчанию.

...