Plus loin dans mon code, je vérifie si un objet est null/vide.
Existe-t-il un moyen de définir un objet sur null?
Un objet d'une classe ne peut pas être défini sur NULL; Cependant, vous pouvez définir un pointeur (qui contient l'adresse de la mémoire d'un objet) sur NULL.
Exemple de ce que vous ne pouvez pas faire et que vous demandez:
Cat c;
c = NULL;//Compiling error
Exemple de ce que vous pouvez faire:
Cat c;
//Set p to hold the memory address of the object c
Cat *p = &c;
//Set p to hold NULL
p = NULL;
S'il est vrai qu'un objet ne peut pas être "vide/null" en C++, en C++ 17, nous avons obtenu std::optional
pour exprimer cette intention.
Exemple d'utilisation:
std::optional<int> v1; // "empty" int
std::optional<int> v2(3); // Not empty, "contains a 3"
Vous pouvez ensuite vérifier si la variable optional
contient une valeur avec
v1.has_value(); // false
ou
if(v2) {
// You get here if v2 is not empty
}
Un int
simple (ou un type quelconque), cependant, ne peut jamais être "nul" ou "vide" (selon votre définition de ces mots) dans un sens utile. Pensez à std::optional
comme un conteneur à cet égard.
Si vous ne disposez pas d'un compilateur compatible C++ 17, vous pouvez utiliser boost.optional à la place. Certains compilateurs antérieurs à C++ 17 proposent également std::experimental::optional
, qui se comportera au moins de manière similaire au std::optional
tant qu’il le sera. Consultez le manuel de votre compilateur pour plus de détails.
Vous voulez vérifier si un objet est NULL/vide. Etre NULL et vide ne sont pas les mêmes. Comme Justin et Brian l'ont déjà mentionné, en C++, NULL est une tâche que vous associez généralement / à des pointeurs. Vous pouvez peut-être surcharger operator =, mais réfléchissez bien si vous voulez réellement le faire. Couple d'autres choses:
bool IsEmpty()
qui renvoie true si les variables d'un objet sont réinitialisées à un état par défaut? Devinez qui pourrait éviter l'utilisation de NULL.A* p = new A; ... p = NULL;
est mauvais (pas de suppression p) sauf si vous pouvez vous assurer que votre code sera récupéré. Cela risquerait de provoquer des fuites de mémoire et, avec plusieurs de ces fuites, il est probable que le code soit lent. class Null {}; Null _NULL;
puis surcharger l'opérateur = et l'opérateur! = D'autres classes en fonction de votre situation. Peut-être devriez-vous nous envoyer quelques détails sur le contexte pour vous aider à mieux utiliser l'option 4.
Arpan
Vous pouvez définir n'importe quel pointeur sur NULL
, bien que NULL
soit simplement défini comme 0 en C++:
myObject *foo = NULL;
Notez également que NULL
est défini si vous incluez des en-têtes standard, mais qu'il n'est pas intégré au langage lui-même. Si NULL
n'est pas défini, vous pouvez utiliser 0 à la place ou inclure ceci:
#ifndef NULL
#define NULL 0
#endif
En passant, si vous voulez vraiment définir un objet, et non un pointeur, sur NULL
, vous pouvez en savoir plus sur le Null Object Pattern .
"un objet" de quel type?
Vous pouvez certainement affecter NULL
(et nullptr
) à des objets de types pointeurs, et son implémentation est définie si vous pouvez affecter NULL
à des objets de types arithmétiques.
Si vous voulez dire des objets d’un type de classe, la réponse estNO(à l’exception des classes dont le type de pointeur ou de type arithmétique accepte operator=
)
"empty" est plus plausible, car de nombreux types ont à la fois une affectation de copie et une construction par défaut (souvent implicitement). Pour voir si un objet existant est similaire à un objet construit par défaut, vous aurez également besoin d'un bool operator==
approprié