Pregunta

Tengo problemas al intentar utilizar una serie de estructuras que no tienen un tamaño inicial.¿Cómo hago esto?Esta es mi estructura:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
} *atom;

Durante mi programa, asigno el tamaño de la matriz de estructuras de esta manera:

  atom = new carbon[PARTICLE_NUM];

El problema es cómo uso esta estructura en otros archivos.Creé un archivo de encabezado y puse esto en él.

extern struct carbon *atom;

Pero aparece este error:

setup_pos.cpp:19: error: invalid use of incomplete type ‘struct carbon’
system_setup_distances.h:18: error: forward declaration of ‘struct carbon’

Sé que no debería usar variables globales, pero solo quiero probar esto primero.Gracias de antemano por la ayuda.

¿Fue útil?

Solución

El archivo fuente donde usa atom necesita la definición completa del carbon estructura.

Coloque la estructura junto con el externo en el mismo archivo de encabezado, como este:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
};

extern struct carbon *atom;

Definir la variable atom En uno de sus archivos fuente:

struct carbon *atom = 0;

Ahora, siempre que necesite acceder atom, incluya el archivo de encabezado donde está la estructura y la declaración externa, y debería funcionar.

PD. En lugar de tener el atom Variable En el espacio de nombres global, podría ponerlo en su propio espacio de nombres:

namespace some_clever_name
{
    struct carbon { ... };
    extern carbon *atom;
}

Y poner esto en un archivo fuente:

some_clever_name::carbon *some_clever_name::atom = 0;

Otros consejos

La definición de la estructura debe estar en el archivo de encabezado.

Debe incluir la definición de la estructura carbon en un archivo de encabezado e incluya ese archivo de encabezado en archivos (.h o .cpp) donde recibe esos errores de tipo incompleto.

¿Por qué el error?
Cada vez que usa una declaración directa, ese tipo se convierte en un tipo incompleto para el compilador, esto se debe a que el compilador solo sabe que la entidad declarada hacia adelante es un tipo de datos, pero no sabe nada sobre el diseño o sus internas, por lo que si realiza alguna Operación que necesita compilador para necesitar el diseño de tipo que se queja con el error.

En su caso, el compilador necesita saber el tamaño de la estructura carbon Para asignar suficiente memoria, lo que no puede, ya que se declara a avance del tipo y, por lo tanto, se queja con el error.

Como dicen las otras respuestas, debe incluir la definición de la estructura en un archivo de encabezado.Pero preguntémonos por qué ¿necesitas esto?

C++ se ha basado desde el principio en C y hereda de C una estrategia de compilación simple:el compilador realiza una pasada y ni el compilador ni el vinculador deberían necesitar acceder a nada excepto al archivo que se les presenta.Cuando se desarrollaron por primera vez C y UNIX, los espacios de direcciones eran limitados y los procesadores eran más lentos de lo que la mayoría de la gente puede imaginar: mi Kindle Fire es una computadora más grande que cualquier otra que haya usado hasta los años 90.

Debido a que estaban simplificando el compilador, en lugar de usar esquemas más complejos como lo hizo PL/I (uno de los antepasados ​​de C), construyeron el preprocesador y usaron archivos de inclusión.El compilador necesita conocer la "forma" de la estructura para poder generar código, por ejemplo si desea acceder mass, necesita saber el desplazamiento desde el comienzo de la estructura.Entonces, en C y C++, debes incluir, textualmente, la descripción de esa "forma".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top