c++ - 一个类使用第二个类,第二个类使用第一个类中定义的结构

标签 c++ vector struct forward-declaration

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

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

我还有一个 Bone 类,它有指向 Vertex 结构的指针 vector (#include < vector >),它看起来像这样:
std::vector< Model::Vertex* > vertices;

Model 类中会有骨骼,所以我在标题中添加了#included Bone 同样,Bone 类需要知道 Vertex 是什么,所以我在其标题中添加了#included Model。
这给出了 Bone 的类型重新定义错误,所以我将 #pragma once 放在 Bone header 的顶部,但现在我的问题是我得到了与上面显示的代码行相关的四个编译错误。
前两个是:error C2653: 'Model' : is not a class or namespace name
后两个是:error C2065: 'Vertex' : undeclared identifier

不过,我确信这行代码在语法上没有任何错误。如果我不在 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 本身。

最佳答案

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

通常前向声明用于指针/引用类型。 前臂 属于骨骼 类型。因此,要实例化 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.

// ....

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

关于c++ - 一个类使用第二个类,第二个类使用第一个类中定义的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215458/

相关文章:

C++ 华氏度到摄氏度(反之亦然)循环问题

c++ - 如何在 QT 中通过 C++ 监控 Linux 中的服务?

c++ - 如何运行一个在 C++ 中有指针的函数?

c++ - 如何创建指向 vector 的指针 vector

xcode - OS 的 Mach 库中出现未知类型名称错误

c++ - 重载运算符==

Python/Pygame 向量数学

math - 基于两个向量创建旋转矩阵

c - 更新全局结构体的成员

c - 结构的填充大小