2011-05-31 10 views
6

He puesto varias instancias de clase b en la clase a, pero esto causa un error ya que la clase a no sabe qué clase es b.Prototipos de clase

Ahora sé que puedo resolver este problema escribiendo mi archivo b a c pero esto arruina la accesibilidad y me molesta. Sé que puedo prototipar mis funciones, así que no tengo este problema pero no he podido encontrar material sobre cómo prototipar una clase.

alguien tiene un ejemplo de creación de prototipos de clase en C++.

ya que parece que hay cierta confusión déjame mostrarte lo que quiero

class A 
{ 
public: 

B foo[5]; 

}; 

class B 
{ 
public: 
int foo; 
char bar; 
} 

pero esto no funciona como A no puede ver B por eso es necesario poner algo antes de los dos, si se trataba de una función Yo pondría A(); luego impleméntalo más tarde. ¿Cómo puedo hacer esto con una clase?

+0

Esta pregunta es muy difícil de entender. ¿Qué significa * escribir mi archivo b a c *? ¿Qué significa crear prototipos de una función? –

+0

@Space_COwbOy escribir mi archivo b a c significa escribir clase b y luego escribir clase a. Esto funciona, pero hace que leer sea difícil ya que la información no se presenta en el orden en que tiene sentido. – Skeith

+0

4 años después, pero ¿por qué no se mueve la declaración B al principio? – Nick

Respuesta

17

Se puede declarar todas sus clases y luego definir en cualquier orden, así:

// Declare my classes 
class A; 
class B; 
class C; 

// Define my classes (any order will do) 
class A { ... }; 
class B { ... }; 
class C { ... }; 
+0

están en el mismo archivo fuente – Skeith

+0

Pensé que con el archivo b a c significaba 3 archivos diferentes. Sin embargo, la solución sería la misma, simplemente declare 'clase B' antes de la definición de' clase A', luego defina 'clase B'. Alternativamente, puede declarar todas las clases antes de definirlas en cualquier orden posterior. – Kanopus

+0

Tengo la clase b definida antes de la clase a pero la quiero al revés, estoy preguntando cómo declarar mis clases para poder definirlas en el orden que desee. – Skeith

1

class b;

 
class a { 
public: 
    b * inst1; 
}; 
class b{ 
.... 
}; 

¿Es esto lo que necesitaba?

+0

sí exactamente lo que quiero pero una instancia, no un puntero, ¿es esto posible? – Skeith

2

La forma habitual de resolver las dependencias circulares es el uso de una declaración hacia adelante:

// Bar.h 

class Foo; // declares the class Foo without defining it 

class Bar { 
    Foo & foo; // can only be used for reference or pointer 
}; 

// Foo.h 

#include <Bar.h> 

class Foo { 
    Bar bar; // has full declaration, can create instance 
} 

le puede proporcionar una declaración completa y definición en otro archivo. Con la declaración forward, puede crear punteros y referencias a la clase, pero no puede crear instancias de la misma, ya que esto requiere la declaración completa.

4

Usted está buscando declaraciones.

class A; 
class B { 
    A MakeA(); 
    void ProcessA(A a); 
}; 
class A { 
    B bs[1000]; 
}; 

Si hacia adelante declara una clase, puede

declare functions taking and returning it or complex types made of it 
declare member variables of pointer or reference to it 

Esto significa básicamente que, en cualquier caso, que no terminan con las instancias de una B en el interior y viceversa, debe ser capaz para declarar y definir cualquier interfaz entre A y B.

+0

Es solo una manera como un equipo tiene muchas clases de lucha y una clase de lucha tiene muchas clases de movimiento, pero creo que has resuelto mi problema – Skeith

Cuestiones relacionadas