繁体   English   中英

如何防止在标头中包含标头以最小化在其他CPP中的标头

[英]How to prevent including header in header to minimise including in other CPPs

我正在使用一个名为Bullet的物理库,但无法阻止将Bullet标头包含在Physics标头中。

//Physics.h
#include <BulletPhysics/btBulletDynamicsCommon.h> // Contains lots of other headers

struct Physics
{
    static btDiscreteDynamicsWorld* pDynamicsWorld;
    static btAlignedObjectArray<btCollisionShape*> collisionShapes;
    static vec3 findSomePoint();
};

现在,在代码的其他各个部分中,我可能想要访问Physics结构,并且为此,我需要包括Physics标头,但是这还将包括所有其他CPP文件中的所有库标头。

我试图找到一种仅在Physics.cpp中包含库标头的方法,但是如果我从Physics.h中删除标头,则很难使编译器识别结构定义中的库类型。

对于某些成员,我可以只进行正向声明,并且可以正常工作,但不适用于非指针或引用类型,因为需要完整的定义。

我注意到,如果使用命名空间,则可以将成员声明为extern,而不必使用完整的类型定义。 但是,使用前向声明会导致一些奇怪的事情:

struct btDiscreteDynamicsWorld; // This seems fine
template <typename T>
struct btAlignedObjectArray; // This works but seems really hacky and I'm not sure if it's even valid

namespace Physics
{
    extern btDiscreteDynamicsWorld* pDynamicsWorld;
    extern btAlignedObjectArray<btCollisionShape*> collisionShapes; // Complete type not needed
    vec3 findSomePoint();
}

同样使用命名空间,我也失去了使用访问说明符的能力。

我还认为,可以使用getter函数和返回引用来代替将成员本身包含在结构中,但是返回类型还至少需要一个前向声明(我认为不是完整的类型),并且我仍然必须前向声明该模板输入我之前的方式。

哪个是最好的方法? 还是我过于强调防止复制多余的标题。 一个标头包含许多其他标头,因此数量很多,因此我不确定是否应该关心。

这两个构造具有相似的含义,不同之处在于第二个构造允许您选择在何处创建和初始化内存。 我个人不会担心过多的递归阅读器内容会导致您的项目很大。 实际上,您在这里使用全局变量来实现一些相当重要的共享状态,这通常表明设计中存在流程。 如果您的程序是多线程的,并且无法解决共享状态,

我建议使用第三种方法,并在getter和setter中执行一些互斥(readers-waiter锁似乎是适当的),在这种情况下,您将需要确保以某种方式仅通过setter修改状态(可能是通过返回const引用)吸气剂。

如果您要坚持使用extern解决方案并以非平凡的方式初始化这些对象(我认为并非如此),则还需要定义某种初始化函数,并确保在其他任何事情之前先调用它您应该考虑改写Singleton类,这就是我要做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM