我正在尝试用骨头制作模型。它加载一个.obj文件来创建网格,并使用一组面来定义模型的每个“骨骼”。
我有一个Model类。在头文件中,我定义了一个称为Vertex的公共(public)结构,该结构存储数据,例如模型中每个顶点的位置和法线方向。
我还有一个Bone类,该类具有指向Vertex结构的指针的 vector (#include ),如下所示:std::vector< Model::Vertex* > vertices;
Model类将包含骨骼,因此我在 header 中包含#include骨骼
同样,Bone类需要知道什么是Vertex,所以我在其 header 中包含#include模型。
这给Bone带来了类型重新定义错误,因此我将#pragma放在Bone header 的顶部,但是现在我的问题是,我得到了与上述代码行有关的四个编译错误。
前两个是:错误C2653:“模型”:不是类或 namespace 名称
后两个是:错误C2065:“顶点”:未声明的标识符
但是,我确定该行代码在语法上没有任何错误。而且,如果我不在Model类中#include骨骼,它就可以很好地工作。
有人知道如何解决这类问题吗?和/或是否有更好的方法可以做到这一点?
编辑:我已经将class Bone;
放在模型的 header 中以进行向前清理,但是在模型 header 的private:部分中,我有Bone forearm;
给出了前臂使用 undefined 类'Bone'的错误。
我不确定是否可以颠倒类的顺序,例如:http://www.parashift.com/c%2B%2B-faq-lite/misc-technical-issues.html#faq-39.14,因为Bone想要一个指向Model::Vertex的指针,而不是Model本身。
最佳答案
通常,前向声明用于指针/引用类型。 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
。这样,编译器的前瞻方法不会失败。