El encabezado circular de C ++ incluye

En un proyecto tengo 2 clases:

// mainw.h

#include "IFr.h" ... class mainw { public: static IFr ifr; static CSize=100; ... }; 

// IFr.h

 #include "mainw.h" ... class IFr { public float[mainw::CSize]; }; 

Pero no puedo comstackr este código, obteniendo un error en el static IFr ifr; línea. ¿Está prohibido este tipo de inclusión cruzada?

¿Este tipo de inclusiones cruzadas están prohibidas?

Sí.

Una solución alternativa sería decir que el miembro ifr de mainw es una referencia o un puntero, por lo que una statement forward servirá en lugar de incluir la statement completa, como:

 //#include "IFr.h" //not this class IFr; //this instead ... class mainw { public: static IFr* ifr; //pointer; don't forget to initialize this in mainw.cpp! static CSize=100; ... } 

Alternativamente, defina el valor de CSize en un archivo de encabezado separado (para que Ifr.h pueda incluir este otro archivo de encabezado en lugar de incluir mainw.h).

No puede tener dos clases que se incrustan de esta manera. Puedes hacer que uno de ellos sea un puntero:

 class foo; class bar { foo* fooPtr; } 

Tendría que construir foo y asignarlo a fooPtr en el constructor de la barra y liberarlo en el destructor; definitivamente es un poco más trabajo.

O, en este caso, como sugirió uno de los comentaristas, haga que mainw :: size defina y póngalo en algún lugar común.

Puedes hacer lo recursivo como este, pero en general también necesitarás usar algún tipo de truco de guardia de encabezado; de lo contrario, el preprocesador entrará en una recursión infinita. Esto realmente no lo ayudará a resolver su problema subyacente, porque esencialmente tiene dos clases, cada una de las cuales requiere mutuamente ver la statement completa de la otra para poder comstackr:

 class mainw { public: static IFr ifr; // needs to see the full declaration of the Ifr class in order to know the size ... class IFr { public float[mainw::size]; // needs to see the full declaration of mainw in order to know what size is 

No importa cuál coloque primero, no podrá comstackr porque necesita conocer todos los detalles del otro.

Ese tipo de inclusión circular no está permitido por C ++, pero esto debería funcionar:

En lugar de incluir IFr.h, use una statement directa.

 class IFr; class mainw { //... }; 

Esto hará que mainw compile muy bien, pero todo el código que usa el miembro ifr necesita incluir IFr.h también.

Esto solo funciona porque ifr es un miembro static . De lo contrario, el comstackdor necesitaría saber el tamaño exacto de ifr .

Además, como muchas otras personas han dicho, debería haber incluido guardias alrededor de ambos encabezados para evitar los errores que provienen de incluir el mismo encabezado dos veces.

 #ifndef IFR_H #define IFR_H //... #endif 

Tu puedes hacer:

 // mainw.h #include "IFr.h" class mainw { public: static const size_t CSize=100; static IFr ifr; ... }; // IFr.h template  struct IFr { float sz_[Sz]; }; 

O en caso de que CSize necesite cambiar en el tiempo de ejecución, use una solución de puntero cuando se muestre la respuesta de @ChrisW.

Si tienes

 #ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H #define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H //... Code.. #endif 

envuelto alrededor de tu código, entonces deberías estar bien 🙂

[EDITAR] Deletrear código: O: P