Depuis en C ++, NULL est essentiel jus 0. Chaque fois que j'ai une variable non initialisée définie sur NULL et plus tard je veux vérifier si cette variable est initialisée ou non en la comparant à NULL. Cependant, si la variable est affectée à 0 quelque part, alors je ne peux pas dire si elle a été initialisée ou non. Il y a certainement du travail autour que je peux faire pour éviter la situation comme utiliser un autre objet enveloppé pour envelopper la variable ou utiliser un indicateur. Mais je recherche une solution plus élégante. Par exemple:

int b[4] = {1,2,3,0};
int a = NULL;
int i = 0;
while(true){
    if(a == 0)return;
    a = b[i++];
}

Donc ici, il entrera tout de suite dans l'instruction if mais je veux attendre que a soit affecté à 0 par le dernier élément de b

c++
1
Jason Liu 17 janv. 2017 à 00:34

2 réponses

Meilleure réponse

Je pense que vous cherchez boost::optional.

#include <boost/optional.hpp>

...

boost::optional<int> maybe_int;

...

if (maybe_int) // test if it has been assigned to
{
    if (maybe_int.value() == 0) // has is been set to zero?
    {
        // ...
    }
}    
7
Richard Hodges 16 janv. 2017 à 21:41

Je pense que vous faites une erreur conceptuelle ici. Même si NULL est défini comme 0 quelque part, cela ne signifie pas qu'ils sont identiques sur le plan conceptuel.

NULL est un pointeur avec (généralement) la valeur 0. Par convention, il ne peut pas y avoir d'objet en NULL. On peut donc utiliser du code tel que MyClass *obj = NULL; pour spécifier qu'il n'y a pas d'objet en obj. Cela fonctionne car obj est un pointeur.

Pour les types sans pointeur, cela ne fonctionne pas et nous devons utiliser d'autres outils tels que la définition arbitraire d'une valeur comme invalide (souvent -1 est utilisé pour cela) ou l'utilisation de optionnels.

4
Georg Schölly 16 janv. 2017 à 21:48