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?
Respuesta
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;
como un lado para quien quiera que aparezca, sí, puede sobrecargar operador = pero esto no es lo que el OP quiere. –
El primero podría funcionar con 'Cat :: operator = (...)'. De todos modos, parece que OP realmente quiere verificar un puntero. Entonces, +1. – jweyrich
@jweyrich: sabía que alguien diría eso, así que vea mi comentario antes de su comentario :) –
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.
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:
- En C++ El puntero NULL es muy diferente al puntero que apunta a un objeto 'vacío'.
- ¿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. - 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. - 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
"¿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
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.
o' std :: experimental :: opcional' si tu compilador lo proporciona. –
@JonathanWakely Buen punto, agregó que. ¡Gracias! –
"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==
- 1. ¿Es posible establecer el objeto Range como "selección hacia atrás"?
- 2. ¿Es nulo un objeto?
- 3. ¿Es posible establecer un bloque como destino en un UIButton?
- 4. ¿Es nulo un objeto en JavaScript?
- 5. GroupBy con Id de posible objeto nulo
- 6. ¿Cómo puedo establecer un registro actual de BindingSource como nulo?
- 7. compruebe si un objeto es nulo
- 8. Nuevo objeto Mysqli es nulo
- 9. ¿Es posible serializar un objeto LINQ?
- 10. ¿Es posible recorrer un objeto Clase C#?
- 11. ¿Es posible eliminar un objeto no nuevo?
- 12. ¿Es posible establecer MasterType programáticamente?
- 13. ¿Es posible serializar automáticamente un objeto C++?
- 14. ¡compara un objeto con nulo!
- 15. wp7 pivotcontrol establecer encabezado nulo
- 16. Objetivo C iPhone cuando establecer referencias de objeto nulo
- 17. si ItemsControl.ItemsSource es nulo
- 18. Secuencia de comandos de acción: ¿Establecer un objeto como nulo elimina automáticamente todos los detectores de eventos adjuntos?
- 19. ¿Es posible que SelectNodes en un XmlDocument devuelva nulo?
- 20. requirejs + IE8: el objeto indefinido es nulo o no es un objeto
- 21. ¿Puedo establecer nulo como valor predeterminado para @Value en Spring?
- 22. ¿Debo verificar si un objeto es nulo primero o segundo?
- 23. IE: 'nodeType' es nulo o no un objeto
- 24. Javascript/jQuery - val() Longitud' es nulo o no un objeto
- 25. ¿Es posible crear un objeto CLHeading en Objective C?
- 26. ¿Es posible usar dibujable + color como fondo?
- 27. ¿Es posible implementar un tipo anulable como NullableOfInteger en VB6
- 28. ¿Es posible establecer la propiedad alpha de un accesorio UITViewViewCell?
- 29. Comprobación de un objeto nulo en C++
- 30. ¿Es posible escribir sintaxis como -()()?
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