Valeur par défaut pour bool en C ++
Je suis la refonte d'un constructeur de classe en C++ et que vous avez besoin pour attraper une quelconque bool. J'ai utilisé des valeurs par défaut pour tous les autres paramètres, mais à partir de ma compréhension bool ne peut être initialisé à true ou false. Depuis deux de ces cas ont de sens que dans la classe, comment dois-je gérer la vérification pour le changement d'une valeur par défaut?
source d'informationauteur voteblake | 2009-05-05
Vous devez vous connecter pour publier un commentaire.
La réalité est que vous ne pouvez pas faire cela. Bool a de la valeur, que ce soit vrai ou faux, et si vous n'avez pas initialisé, puis il est au hasard vrai ou faux, peut-être différente à chaque exécution du programme ou de l'attribution de cette catégorie.
Si vous avez besoin d'avoir un type avec plus d'options, définissez un enum.
Tristate bool est le chemin vers le côté obscur. Tristate bool mène à la colère. La colère mène à la haine. La haine mène à la souffrance.
Préférez ne pas utiliser une tristate bool.
Au lieu de cela, utiliser un booléen pour savoir si le premier booléen est "initialisé" (ou mieux, "connu") ou pas.
Si le veredict n'est pas encore connu, vous ne pouvez pas dire si le Prisonnier est vraiment coupable, mais votre code peuvent se différencier entre les différentes situations. Bien sûr, la Constitution garantit que la valeur par défaut de is_guilty doit être fausse, mais, tout de même... 🙂
Par le chemin, la classe invariant devrait inclure:
Il semble que vous voulez boost::tribool ou peut-être boost::optional<bool>.
Si c'est ce que vous avez besoin, créez une valeur qui représente le concept de valeur qui n'ont pas été initialisé.
Maintenant, vous pouvez représenter tous les 3 états dont vous avez besoin.
En C++ un
bool
n'est qu'un bit d'information, un 0 ou un 1. Puisque vous voulez représentent les trois états possibles, vous avez besoin d'un peu plus d'informations. Il existe deux techniques:bool
valeur pour indiquer si la valeur est "par défaut" ou pas, ouJe serais probablement choisir l'option 1.
Utiliser le bon boost::optional. Et pas seulement pour les booléens, mais pour tous les autres endroits que vous avez utilisé
certains sale pas initialisées avec des valeurs. Elle s'utilise comme ceci:
Et voici un exemple de fonction de retour facultatif:
Vous pourriez avoir un membre privé qui indique si la valeur booléenne a effectivement été initialisé ou non.
Je n'ai pas tout à fait comprendre, mais je vais essayer...
Valeurs par défaut sont appliquées lorsque vous avez un agrégat d'initialiseur que les feuilles des valeurs quelconques. Dans ce cas, booléen par défaut est false. Dans une classe, la valeur "par défaut" serait non initialisée, le sens qu'il pourrait être n'importe quelle valeur et peuvent changer d'une exécution.
Si vous êtes intéressé à savoir si ou non un bool a changé, votre meilleure option est de garder une trace de celui-ci avec un deuxième défaut bool false, ou utiliser un enum représentant les 3 états possibles. Si vous voulez vraiment 3 états, vous ne voulez vraiment pas un booléen.
Vous ne pouvez vraiment pas. Pourriez-vous fournir un deuxième constructeur, par exemple:
Au lieu d'un booléen, utiliser une énumération. Par exemple, pour contrôler le niveau de magie:
Ensuite, demandez à votre constructeur accepter un paramètre
MagicLevel magic = MY_ENUM_NO_MAGIC
.Eh bien, si votre utilisation de fonctions et de classes, juste de surcharge.
ie:
//et là vous allez. Aussi, vous n'avez pas besoin d'avoir une classe que vous pouvez simplement utiliser les fonctions surchargées.