web-dev-qa-db-fra.com

Est-il possible de définir un objet sur null?

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?

34
John

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;
40
Brian R. Bondy

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.

7
Baum mit Augen

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: 

  1. En C++, le pointeur NULL est très différent du pointeur pointant sur un objet "vide". 
  2. Pourquoi ne pas avoir une méthode 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.
  3. Avoir quelque chose comme 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. 
  4. Vous voudrez peut-être faire ceci 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

4
Fanatic23

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 .

3
Justin Ardini

"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é 

0
Caleth