Plus loin dans mon code, je vérifie si un object est null / vide.
Existe-t-il un moyen de définir un object sur null?
Un object 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 object) sur NULL.
Exemple de ce que vous ne pouvez pas faire 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 object ne peut pas être “vide / null” en C ++, en C ++ 17, nous avons std::optional
pour exprimer cette intention.
Exemple d’utilisation:
std::optional v1; // "empty" int std::optional v2(3); // Not empty, "contains a 3"
Vous pouvez ensuite vérifier si l’ optional
contient une valeur avec
v1.has_value(); // false
ou
if(v2) { // You get here if v2 is not empty }
Un simple int
(ou n’importe quel type), 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 à std::optional
afaik. Consultez le manuel de votre compilateur pour plus de détails.
Vous voulez vérifier si un object 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 surcharger operator = peut-être, 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 object sont réinitialisées à un état par défaut? Devinez qui pourrait éviter l’utilisation de NULL. A* p = new A; ... p = NULL;
A* p = new A; ... p = NULL;
est mauvais (pas de suppression p) sauf si vous pouvez vous assurer que votre code sera nettoyé. Cela risquerait de provoquer des memory leaks et, avec plusieurs de ces fuites, il est probable que le code soit lent. class Null {}; Null _NULL;
class Null {}; Null _NULL;
puis surchargez 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 sur 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 object, et non un pointeur, sur NULL
, vous pouvez en savoir plus sur le modèle d’object Null .
“un object” de quel type?
Vous pouvez certainement assigner NULL
(et nullptr
) aux objects de types pointeurs, et son implémentation est définie si vous pouvez affecter NULL
à des objects de types arithmétiques.
Si vous entendez des objects d’un type de classe, la réponse est NON (sauf les classes ayant des types operator=
acceptant le type pointeur ou arithmétique)
“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 object existant ressemble à un object construit par défaut, vous aurez également besoin d’un bool operator==
approprié bool operator==