2010-06-13 11 views
30

Además en mi código, verifico para ver si un objeto es nulo/vacío. ¿Hay alguna forma de establecer un objeto como nulo?¿Es posible establecer un objeto como nulo?

+3

Debe tener cuidado con su terminología (¿quiere comprobar si apunta a nulo, o si el objeto ¿es nulo?) Parece que proviene de un lenguaje administrado. Los objetos C++ nunca pueden ser nulos o vacíos. Los punteros pueden contener un valor de puntero nulo que indica que apuntan a nada. Las referencias siempre se refieren a un objeto. No recomendaría intentar enseñarte C++ con conocimiento de otros idiomas, te lastimarás. Consigue un buen libro para principiantes, es la mejor forma de aprender. http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG

Respuesta

34

Un objeto de una clase no se puede establecer a NULL; sin embargo, puede establecer un puntero (que contiene una dirección de memoria de un objeto) en NULL.

ejemplo de lo que no se puede hacer lo que usted está pidiendo:

Cat c; 
c = NULL;//Compiling error 

ejemplo de lo que puede hacer:

Cat c; 
//Set p to hold the memory address of the object c 
Cat *p = &c; 
//Set p to hold NULL 
p = NULL; 
+8

como un lado para quien quiera que aparezca, sí, puede sobrecargar operador = pero esto no es lo que el OP quiere. –

+1

El primero podría funcionar con 'Cat :: operator = (...)'. De todos modos, parece que OP realmente quiere verificar un puntero. Entonces, +1. – jweyrich

+1

@jweyrich: sabía que alguien diría eso, así que vea mi comentario antes de su comentario :) –

3

Se puede establecer cualquier puntero a NULL, aunque es simplemente NULL definido como 0 en C++:

myObject *foo = NULL; 

También tenga en cuenta que NULL se define si incluye encabezados estándar, pero no está integrado en el idioma en sí. Si NULL no está definido, se puede utilizar en lugar 0, o incluir lo siguiente:

#ifndef NULL 
#define NULL 0 
#endif 

Como acotación al margen, si realmente desea establecer un objeto, no un puntero, a NULL, se puede leer sobre el Null Object Pattern.

3

Desea verificar si un objeto es NULO/vacío. Ser NULL y estar vacíos no son lo mismo. Al igual que Justin y Brian ya han mencionado, en C++ NULL es una asignación que normalmente asociar con los punteros. Puede sobrecargar operator = quizás, pero piense bien si realmente quiere hacer esto. Un par de otras cosas:

  1. En C++ El puntero NULL es muy diferente al puntero que apunta a un objeto 'vacío'.
  2. ¿Por qué no tener un método bool IsEmpty() que devuelve verdadero si las variables de un objeto se restablecen a algún estado predeterminado? Adivina que podría eludir el uso NULO.
  3. Tener algo así como A* p = new A; ... p = NULL; es malo (no eliminar p) a menos que pueda asegurarse de que su código será basura. En todo caso, esto daría lugar a fugas de memoria y, con varias de esas fugas, hay buenas posibilidades de que tenga un código lento.
  4. Es posible que desee hacer esto class Null {}; Null _NULL; y luego sobrecargar operator = y operator! = De otras clases, dependiendo de su situación.

Quizás nos debería publicar algunos detalles sobre el contexto para ayudarle mejor con la opción 4.

Arpan

+0

"¿Por qué no tener un bool IsEmpty() método ..." - hay algunas buenas razones para no hacerlo. El más importante es que generalmente depende del contexto si tiene sentido. Una solución más robusta es usar 'boost :: optional ' para indicar si tiene un objeto T válido o no. Esto evitará que invoques 'x.foo()' cuando 'x.IsEmpty() == true' – MSalters

5

Si bien es cierto que un objeto no puede ser "vacío/null" en C++, en C++ 17, obtuvimos std::optional para expresar esa intención.

Ejemplo uso:

std::optional<int> v1;  // "empty" int 
std::optional<int> v2(3); // Not empty, "contains a 3" 

a continuación se puede comprobar si la optional contiene un valor con

v1.has_value(); // false 

o

if(v2) { 
    // You get here if v2 is not empty 
} 

Una llanura int (o cualquier tipo), sin embargo , nunca puede ser "nulo" o "vacío" (según su definición de esas palabras) en ningún uso ul sentido. Piense en std::optional como un contenedor en este sentido.

Si no tiene un compilador que cumpla con C++ 17, puede usar boost.optional en su lugar. Algunos compiladores anteriores a C++ 17 también ofrecen std::experimental::optional, que se comportará al menos cerca del afaik std::optional real. Consulte el manual de su compilador para más detalles.

+1

o' std :: experimental :: opcional' si tu compilador lo proporciona. –

+0

@JonathanWakely Buen punto, agregó que. ¡Gracias! –

0

"un objeto" de qué tipo?

Sin duda puede asignar NULL (y nullptr) a objetos de tipos de puntero, y se define la implementación si puede asignar NULL a objetos de tipos aritméticos.

Si se refiere a objetos de algún tipo de clase, la respuesta es (clases excepto que tienen puntero operator= aceptar o tipos aritméticos) NO

"vacío" es más plausible, ya que muchos tipos tienen tanto de asignación de copia y construcción por defecto (a menudo implícitamente). Para ver si un objeto existente es como uno construido por defecto, también necesitará un apropiado bool operator==

Cuestiones relacionadas