Así que tengo una clase A, donde quiero llamar a algunas funciones de clase B. Entonces incluyo "b.h". Pero, en la clase B, quiero llamar a una función de clase A. Si incluyo "a.h", termina en un ciclo infinito, ¿verdad? ¿Qué puedo hacer al respecto?¿Pueden dos clases verse unas a otras usando C++?
Respuesta
Cada clase (A y B) debe tener un archivo de cabecera y un archivo de implementación.
Cada archivo de cabecera (por ejemplo A.h
) no debe incluir otro archivo de cabecera (por ejemplo B.h
) pero puede incluir una referencia hacia adelante a la otra clase (por ejemplo, una declaración como class B;
), y luego se puede utilizar punteros y/o referencias a la otra clase en su declaración (por ejemplo, class A
puede contener B*
como un miembro de datos y/o como un parámetro de método).
Cada archivo CPP (por ejemplo, A.cpp
) puede incluir más de un archivo de encabezado (por ejemplo, A.h
y B.h
). Se recomienda que cada archivo CPP incluya primero su propio archivo de encabezado (por ejemplo, A.cpp
debe incluir A.h
y luego B.h
, mientras que B.cpp
debe incluir B.h
y luego A.h
).
Cada archivo de encabezado solo debe contener la declaración y no la definición de la clase: por ejemplo, listará las firmas de los métodos de la clase, pero no el método bodies/implementations (los cuerpos/implementaciones del método estarán en el archivo .cpp
, no en el archivo de encabezado). Debido a que los archivos de encabezado no contienen detalles de implementación, por lo tanto, no dependen (no necesitan ver) los detalles de otras clases; a lo sumo necesitan saber que, por ejemplo, B
es el nombre de una clase: que puede obtener de una declaración directa, en lugar de incluir un archivo de encabezado en otro archivo de encabezado.
Ponga solo declaraciones de función de miembro en archivos de encabezado (.h) y coloque definiciones de función de miembro en archivos de implementación (.cpp). Entonces, sus archivos de encabezado no necesitan incluirse entre sí, y puede incluir ambos encabezados en cualquiera de los archivos de implementación.
Para casos, es necesario hacer referencia a la otra clase de firmas de los miembros, así, se puede utilizar una declaración adelantada:
class A;
Esto le permite utilizar puntero y de referencia tipos (A*
y A&
), aunque no A
sí mismo. Tampoco te permite llamar a miembros.
Ejemplo:
// a.h
struct B; // forward declaration
struct A {
void foo(B* b); // pointers and references to forward-declared classes are ok
};
// b.h
struct A; // forward declaration
struct B {
void bar(A& a); // pointers and references to forward-declared classes are ok
};
// a.cpp
#include "a.h"
#include "b.h"
void A::foo(B* b) {
b->bar(*this); // full declaration of B visible, ok to call members now
}
// b.cpp
#include "a.h"
#include "b.h"
void B::bar(A& a) {
a.foo(this); // full declaration of A visible, ok to call members now
}
También se puede utilizar para obtener forward declarations en torno al tema.
Intente poner #ifndef
, #define
y #endif
alrededor de sus archivos .h.
- 1. Las clases de Xcode no pueden "verse" entre ellas
- 2. ¿Cómo organizo clases de C# que heredan unas de otras, pero también tienen propiedades que heredan unas de otras?
- 3. Usando cadenas de otras clases C#
- 4. ¿Pueden dos clases hacerse amigos?
- 5. clases de decisiones públicas a otras clases en C++
- 6. En C++, ¿cuándo pueden verse dos variables del mismo nombre en el mismo ámbito?
- 7. Python usando métodos de otras clases
- 8. Cómo mapear diferentes estructuras Java-Bean unas a otras
- 9. heredan de dos clases en C#
- 10. ¿Las clases abstractas pueden implementarse en C#?
- 11. Método de acceso de otras clases Objetivo-C
- 12. ¿Cómo ofuscar solo unas pocas clases o un solo paquete?
- 13. seguridad de la hebra C# al hacer referencia a las propiedades estáticas en otras clases
- 14. ¿Pueden los ISR migrar a otras CPU cuando se evitan?
- 15. C++, dos clases con necesidades mutuas
- 16. ¿Cuál es un buen patrón de diseño en C# para las clases que necesitan hacer referencia a otras clases?
- 17. C++: dos clases que se necesitan
- 18. Usar correctamente las clases en otras clases en php?
- 19. C++: ¿Declarar una clase global y acceder a ella desde otras clases?
- 20. no se pueden agregar dos números decimales usando jQuery
- 21. Dos lugares decimales usando C#
- 22. ¿Qué clases no se pueden subclasificar?
- 23. Comparando dos clases usando el operador de igualdad
- 24. C++ 11 inicialización uniforme no estática miembro de datos falla para punteros a otras clases de la misma clase base
- 25. ¿Cómo extender apropiadamente otras clases en Python? (python v3.3)
- 26. iPhone KVO entre dos clases
- 27. ¿Por qué se pueden publicar algunas matrices pero no otras?
- 28. ¿Cómo puedo tener referencias entre dos clases en Objective-C?
- 29. Compilación de C++ cuando dos clases se refieren entre sí
- 30. ¿Cómo compartir una variable entre dos clases?
Esta publicación tampoco responde la pregunta .. –