Question

Puis-je utiliser des arguments par défaut dans un constructeur comme celui-ci peut-être

Soldat (ID d'entité, int hlth = 100, int exp = 10, chaîne nme): ID d'entité (entyID = globalID ++), santé (hlth), expérience (exp), nom (nme = SelectRandomName (exp) ) {}

Je veux par exemple exp = 10 par défaut, mais je peux remplacer cette valeur si je la fournis dans le constructeur, sinon il devrait utiliser la valeur par défaut.

Comment puis-je faire cela, je sais que mon approche ne fonctionne pas ....

Si je fournis une valeur dans la liste d'initialisation, peu importe ce que je fournis dans un constructeur, il est bien sûr écrasé. Par contre, chaque fois que je fournis une valeur dans un constructeur, pourquoi ai-je besoin d'une valeur par défaut en premier lieu, comme à chaque fois que je suis fournir une valeur pour l'initiation d'objet ...?

Devrais-je utiliser différents constructeurs surchargés ou avez-vous d'autres idées ...?

Était-ce utile?

La solution

Les arguments par défaut ne peuvent être fournis qu'à une plage continue de paramètres qui s'étend jusqu'à la fin de la liste de paramètres. En termes simples, vous pouvez fournir des arguments par défaut à 1, 2, 3, ... N derniers paramètres d’une fonction. Vous ne pouvez pas fournir d'arguments par défaut aux paramètres situés au milieu de la liste de paramètres, comme vous essayez de le faire ci-dessus. Réorganisez vos paramètres (insérez hlth et exp à la fin) ou fournissez également un argument par défaut pour nme .

De plus, votre liste d’initialisation constructeur ne semble pas avoir de sens. Quel était l’intérêt de passer entyID et nme de l’extérieur, si vous surchargez quand même leurs valeurs dans la liste d’initialisation du constructeur?

Autres conseils

Tous les paramètres avec des arguments par défaut doivent être après tous les arguments requis. Vous devez déplacer le paramètre nme avant hlth .

Je pense que vous pouvez le faire, cependant, tous vos arguments par défaut devront être éliminés à la fin. Ainsi, dans votre exemple, la signature du constructeur serait

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

Les arguments avec des valeurs par défaut doivent être les derniers arguments de la déclaration de fonction. En d'autres termes, il ne peut y avoir d'argument sans valeur par défaut, après un avec une valeur par défaut.

Seuls les arguments de fin peuvent être des arguments par défaut. Vous devez attribuer à nme un argument par défaut ou modifier l'ordre des arguments utilisés par le constructeur pour que hlth et exp arrivent en dernier. / p>

En ce qui concerne l'affectation que vous effectuez dans la liste d'initialisation, il se produit que le membre entityID se voit attribuer la valeur renvoyée par l'attribution de globalID ++ à entyID qui sera la valeur de entyID après l'affectation. Une chose similaire se produit pour nom .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top