2009-10-27 144 views
2

我可以使用默认参数的构造函数这样也许默认参数

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

我想例如EXP = 10默认,但能够覆盖这个值,如果我在构造函数中提供它否则它应该使用默认值。

我怎么能做到这一点,我知道我的方法是行不通的....

如果我提供的初始化列表,无论什么我在构造函数中提供大干快上。另一方面ofcourse覆盖的任何值,每当我在构造函数中提供一个值,那么为什么每当我为对象启动提供一个值时,我首先需要默认值...?

我应该使用不同的重载构造函数还是你有其他想法....?

+0

是的,你应该使用重载的构造函数。 – 2009-10-27 23:14:22

+0

您的构造函数定义不会编译,而您的文章似乎描述了运行时行为。这意味着你很可能发布了一个伪造的构造函数定义。请发布一个真实的。 – AnT 2009-10-27 23:51:50

+0

如果你的构造函数可能只有一个参数被调用,它应该是“显式”的。 – 2009-10-28 07:35:19

回答

8

默认参数只能提供给延伸到参数列表末尾的连续参数范围。简而言之,您可以将默认参数提供给1,2,3,... N 上一个函数的参数。正如您在上面所做的那样,您不能为参数列表中的参数提供默认参数。重新排列参数(最后输入hlthexp),或者为nme提供默认参数。

此外,你的构造函数初始化列表似乎没有任何意义。如果你在构造函数初始化列表中覆盖它们的值,那么从外部传入entyIDnme的意义何在?

2

所有具有默认参数的参数都必须位于任何必需的参数之后。您应该在hlth之前移动nme参数。

2

我相信你可以做到这一点,但是,所有违约参数最后都需要去掉。所以,在你的例子中,构造签名会

Soldier(int entyID, string nme, int hlth = 100, int exp = 10); 
1

参数的默认值必须在函数声明的最后一个参数。换句话说,没有缺省值的默认值之后就不能有任何参数。

1

只有结尾参数可以是默认参数。您需要给nme一个默认参数或更改构造函数所需参数的顺序,以使hlthexp最后一个。

至于你的初始化器列表进行分配会发生什么有该成员entityID被分配由的globalID++分配回到entyID其价值将是entyID分配后的价值。类似的事情发生在name