2009-10-27 173 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