一个类使用第二个类,它使用第一个中定义的结构

时间:2011-08-27 15:23:06

标签: c++ vector struct forward-declaration

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

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

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

Model类中会包含骨骼,因此标题中包含#included Bone 同样,Bone类需要知道Vertex是什么,所以我的标题中有#included Model 这给了Bone一个类型重定义错误,所以我把#pragma一次放在Bone头的顶部,但是现在我的问题是我得到了与上面显示的代码行有关的四个编译错误。
前两个是:错误C2653:'Model':不是类或命名空间名称
第二个是:错误C2065:'顶点':未声明的标识符

但是我确信这行代码没有语法错误。如果我在Model类中没有#include Bone,那么它的工作原理非常好。

有人知道如何解决这类问题吗?和/或有更好的方法吗?

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

1 个答案:

答案 0 :(得分:1)

  

我放了班骨;在用于前向声明的Model的标题中,但在Model标题的private:部分中,我有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包含{{1}}的每个源文件。这样,编译器期待的方法不会失败。

相关问题