Один класс использует второй класс, который использует структуру, определенную в первом - PullRequest
0 голосов
/ 27 августа 2011

Я пытаюсь сделать модель с костями.Он загружает файл .obj для создания сетки и использует группы граней для определения каждой "кости" или части модели.

У меня есть класс Model.В заголовочном файле я определил открытую структуру Vertex, в которой хранятся такие данные, как положение и нормальное направление для каждой вершины в модели.

У меня также есть класс Bone, в котором есть вектор (#include) указателей на структуру Vertex, которая выглядит следующим образом:
std::vector< Model::Vertex* > vertices;

В классе Model будут содержаться кости, поэтому в заголовке у меня есть #included Bone. Аналогично, Boneкласс должен знать, что такое Vertex, поэтому у меня в заголовке #included Model.
Это дает ошибку переопределения типа для Bone, поэтому я поставил #pragma один раз в верхней части заголовка Bone, но теперь моя проблема заключается в том, чтопри этом я получаю четыре ошибки компиляции, относящиеся к строке кода, показанной выше.
Первые два: ошибка C2653: «Модель»: это не имя класса или пространства имен
Вторые два: ошибка C2065: «Вершина»: необъявленный идентификатор

Однако я уверен, что в этой строке кода нет ничего синтаксически неправильного.И если я не включу Bone в класс Model, он прекрасно работает.

Кто-нибудь знает, как решить проблему такого типа?И / или есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ: я поместил class Bone; в заголовок Model для прямого декларирования, но в частном разделе: заголовка Model, у меня есть Bone forearm; который выдает ошибку, что предплечье использует неопределенный класс 'Bone'.
Я не уверен, смогу ли я изменить порядок классов, таких как: http://www.parashift.com/c%2B%2B-faq-lite/misc-technical-issues.html#faq-39.14,, потому что Bone хочет указатель на Model:: Вершина, а не сама модель.

1 Ответ

1 голос
/ 27 августа 2011

Я поставил класс Bone; в заголовке Model для прямого объявления, но в частном: разделе заголовка Model, у меня Bone предплечье; который выдает ошибку, что предплечье использует неопределенный класс Bone.

Обычно предварительные объявления используются для указателей / ссылочных типов. forearm относится к типу Bone. Таким образом, для создания экземпляра forearm необходимо увидеть полное определение класса Bone. Форвардная декларация не просто достаточна.

// 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.

// ....

Или вы всегда должны убедиться, что Bone.h включен до Model.h, в каждый исходный файл, который включает Model.h. Таким образом, подход с ожиданием компилятора не потерпит неудачу.

...