Una clase usa una segunda clase que usa una estructura definida en la primera

Estoy intentando hacer un modelo con huesos. Carga un archivo .obj para crear la malla y usa grupos de caras para definir cada "hueso" o parte del modelo.

Tengo una clase de modelo. En el archivo de encabezado, definí una estructura pública llamada Vertex, que almacena datos como la posición y la dirección normal para cada vértice en el modelo.

También tengo una clase Bone, que tiene un vector (#include <vector>) de punteros a la estructura Vertex, que se ve así:
std::vector< Model::Vertex* > vertices;

La clase Model tendrá huesos, así que he #incluido Bone en el encabezado. Asimismo, la clase Bone necesita saber qué es Vertex, así que tengo #included Model en su encabezado.
Esto da un error de redefinición de tipo para Bone, así que puse #pragma una vez en la parte superior del encabezado de Bone, pero ahora mi problema es que obtengo cuatro errores de compilación relacionados con la línea de código que se muestra arriba.
Los dos primeros son: error C2653: 'Modelo': no ​​es un nombre de clase o espacio de nombres
Los dos segundos son: error C2065: 'Vertex': identificador no declarado

Sin embargo, estoy seguro de que no hay nada de malo sintácticamente en esa línea de código. Y si no incluyo a Bone en la clase Modelo, funciona perfectamente bien.

¿Alguien sabe cómo resolver este tipo de problemas? ¿Y / o hay una mejor manera de hacer esto?

EDITAR: he puesto class Bone; en el encabezado del modelo para la declinación hacia adelante, pero en la sección privada: del encabezado del modelo, tengo Bone forearm; lo que da un error de que el antebrazo usa una clase indefinida 'Hueso'.
No estoy seguro de poder revertir el orden de las clases, como por ejemplo: http://www.parashift.com/c%2B%2B-faq-lite/misc-technical-issues.html#faq-39.14, porque Bone quiere un puntero a Model :: Vertex, no al Model en sí.

preguntado el 27 de agosto de 11 a las 15:08

1 Respuestas

He puesto clase Bone; en el encabezado del modelo para la declaración hacia adelante, pero en la sección privada: del encabezado del modelo, tengo antebrazo de hueso; lo que da un error de que el antebrazo usa una clase indefinida 'Hueso'.

Por lo general, las declaraciones hacia adelante se utilizan para tipos de puntero / referencia. forearm es de Bone escribe. Entonces, para forearm para instanciar, debería ver la definición de clase completa de Bone. La declaración anticipada no es suficiente.

// Model.h
class Bone;  // Forward declaration
class Model{
    Bone *forearm; // or Bone& forearm;
    // .....
};

// Model.cpp
#include "Bone.h"
#include "Model.h" // This inclusion order doesn't matter.

// ....

O siempre te aseguras de que Bone.h se incluye antes Model.h, en cada archivo fuente que incluya Model.h. De esa manera, el enfoque del compilador de mirar hacia adelante no fallará.

Respondido 27 ago 11, 20:08

@Tim: sí, si se apega a su diseño actual. - Mahesh

@Tim - Hueso is una especie de modelo. Por lo tanto, derivar Bone from Model y diseñar en consecuencia sería una buena idea, en mi opinión. - Mahesh

Para evitar problemas de administración de memoria, recomendaría usar punteros inteligentes como boost :: shared_ptr en lugar de punteros sin formato. La declaración de reenvío seguirá funcionando. - alehro

@Mahesh, pero si el antebrazo es un puntero a Bone, ¿cómo puedo tener varios huesos con diferentes valores? la clase Model maneja la malla y tiene muchos huesos que deforman los vértices - Tim Orton

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.