class A
{
A a;//why can't we do this
};
Respuesta
Usted puede hacer
class A {
A* a;
}
, ya que no requiere conocer el tamaño de A.
A a;//why can't we do this
Debido A
es un tipo incompleto, ya que no se ha definido todavía, sino que está siendo definida. Y el compilador necesita saber el tipo completo de A
cuando lo ve en el interior class A
, y desde A
es incompleta, no puede determinar su tamaño, que no puede determinar cuánto espacio de la variable miembro a
va a tomar, por lo tanto, no lo compilará
Pero dado que el compilador conoce bien el tamaño de un puntero, independientemente del tipo de puntero que sea. Se puede definir un puntero en su clase como esta:
class A
{
A *pA; //okay since sizeof(pA) == sizeof(void*) == well-known to the compiler!
};
Demo Online: http://www.ideone.com/oS5Ir
Debido a que la clase sería infinito en tamaño.
(Esto se hace lenguaje en cuanto al especificar que no se puede tener tipos incompletos como miembros, única referencia o punteros a ellos, y que A
es un tipo incompleto hasta el final de la definición de clase.)
¿Y qué pasa si es de tamaño infinito? ¡La memoria es barata hoy en día! –
@James: me recuerda al tipo que quería escribir un programa que crea todas las palabras posibles de hasta 23 letras y no se inmutó cuando le dije que necesitaría más de un millón de discos duros TB para eso ... – EboMike
Supongo que vienes de Java o algo así. A a
creará una instancia completa del tipo A
, que, bien, contiene A
, que contiene A
, que contiene A
.
Probablemente usted está pensando en esto:
class A
{
A *a; // A pointer to A, not a full instance
};
En C++: Usted no se puede hacer esto, ya que será una estructura recursiva (no hay fin para calcular el tamaño del objeto), para superar este problema,
Usar el autoreferencia Puntero ial, es decir, el puntero que tiene la dirección del mismo tipo de clase.
class A
{
A* aObj; // Self Referential Pointer
}
Esta es la forma en que puede tener un puntero al objeto de la clase A y de esta manera no es necesario conocer el tamaño de la clase A antes de que se declaró en tiempo de compilación.
class A {
A* a;
};
Class Date
{
int d,m,y;
static Date default_date;
};
Este ejemplo se da en "Bjarne Stroustrup El C++ Programming Language - 3ª edición".
Y funciona ... Alguna explicación sería agradable.
- 1. ¿Por qué no podemos declarar alias de espacio de nombres dentro de una clase?
- 2. Declarar una instancia de una clase dentro de esa clase
- 3. Declarar una enumeración dentro de una clase
- 4. Clases abstractas, ¿por qué no podemos declarar val privado y miembro de la clase var?
- 5. Declarar una clase dentro de un módulo
- 6. por qué no podemos crear nuestro propio objeto ostream
- 7. Por qué tienen clase estática pública dentro de una clase
- 8. Por qué no puedo realizar varias declarar una clase
- 9. IllegalArgumentException: objeto no es una instancia de declarar clase
- 10. C# - ¿Es posible reemplazar un método en una clase base dentro de la misma clase (NO una clase derivada)?
- 11. ¿Por qué no puedo usar HttpServerUtility.HtmlEncode dentro de una clase?
- 12. declarar una instancia de una clase const
- 13. Declarar un diccionario dentro de una clase estática
- 14. La llamada al método Spring @Transaction por el método dentro de la misma clase, ¿no funciona?
- 15. ¿Cómo declarar una variable global desde dentro de una clase?
- 16. ¿Puedo declarar "using namespace" dentro de una clase de C++?
- 17. El viejo "@Transactional desde dentro de la misma clase" Situación
- 18. ¿Por qué una clase no puede extender rasgos con el método de la misma firma?
- 19. ¿Por qué no podemos inicializar miembros dentro de una estructura?
- 20. ¿Por qué no podemos declarar var a = new List <string> en el nivel de clase?
- 21. ¿Por qué no podemos declarar una variable estática dentro de una estructura en el lenguaje de programación C?
- 22. función de llamada de CodeIgniter dentro de una misma clase
- 23. ¿Deberías declarar enumeraciones dentro o fuera de una clase?
- 24. Objeto de clase que no funciona dentro de ob_start callback
- 25. val y objeto dentro de una clase scala?
- 26. ¿Por qué no hay una clase java.lang.Array? Si una matriz de Java es un Objeto, ¿no debería extender Objeto?
- 27. ¿Para qué sirve crear una clase dentro de la interfaz e interfaz dentro de la clase
- 28. Python 2.6: ¿clase dentro de una clase?
- 29. atributo de clase de dos instancias de la misma clase
- 30. ¿Por qué no puedo acceder a los métodos de clase privados en el objeto complementario de la clase en Scala?
¿Qué pasaría cuando se crea una instancia de dicha clase? Construiría una A, que construiría otra A, y así sucesivamente, hasta el final de los tiempos. Entonces, sí, un constructor que hace un desbordamiento de pila no es algo bueno. Ah, sí, y la instancia tendría un tamaño infinito. –
Son las tortugas hasta abajo. – jason