关于c ++:一个类使用第二个类,该类使用第一个类中定义的结构

One class uses a second class which uses a struct defined in the first

我正在尝试用骨头制作模型。它加载一个.obj文件来创建网格,并使用面组定义模型的每个"骨骼"。

我有一个Model类。在头文件中,我定义了一个称为Vertex的公共结构,该结构存储数据,例如模型中每个顶点的位置和法线方向。

我还有一个Bone类,该类具有指向Vertex结构的指针的矢量(#include ),如下所示:
std::vector< Model::Vertex* > vertices;

Model类将包含骨骼,因此我在标头中包含#include骨骼
同样,Bone类需要知道什么是Vertex,因此我在其标头中包含#include模型。
这给Bone带来了类型重定义错误,因此我将#pragma放在了Bone标头的顶部,但是现在我的问题是,我遇到了与上述代码行有关的四个编译错误。
前两个是:错误C2653:"模型":不是类或名称空间名称
后两个是:错误C2065:"顶点":未声明的标识符

但是,我确定该行代码在语法上没有任何错误。而且,如果我不将#one包含在Model类中,它会很好地工作。

有人知道如何解决这类问题吗?和/或是否有更好的方法可以做到这一点?

编辑:我已经将class Bone;放在模型的标头中以进行向前清理,但是在模型标头的private:部分中,我有Bone forearm;,该错误给出了前臂使用未定义类'Bone'的错误。
我不确定是否可以颠倒此类的顺序,例如:http://www.parashift.com/c%2B%2B-faq-lite/misc-technical-issues.html#faq-39.14,因为骨骼需要一个指向Model :: Vertex的指针,而不是Model本身。


I have put class Bone; in the header of Model for forward declaration, but in the private: section of the Model header, I have Bone forearm; which gives an error that forearm uses an undefined class 'Bone'.

通常,前向声明用于指针/引用类型。 forearmBone类型。 因此,要实例化forearm,它应该看到Bone的完整类定义。 向前声明并不仅仅是。

1
2
3
4
5
6
7
8
9
10
11
12
// 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.

// ....

或者,您始终确保在每个包含Model.h的源文件中,在Model.h之前包括Bone.h。 这样,编译器的前瞻方法不会失败。