2011-02-09 24 views
7
class A 
{ 
    A a;//why can't we do this 
}; 
+1

¿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. –

+13

Son las tortugas hasta abajo. – jason

Respuesta

15

Usted puede hacer

class A { 
    A* a; 
} 

, ya que no requiere conocer el tamaño de A.

6
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

16

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.)

+12

¿Y qué pasa si es de tamaño infinito? ¡La memoria es barata hoy en día! –

+2

@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

9

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 
}; 
1

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 
} 
1

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; 
}; 
-1
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.

Cuestiones relacionadas