如何跨文件分发标头

时间:2014-01-26 22:09:13

标签: c++ header-files

编辑澄清:

有没有办法在多个文件中拆分一个类的标题,这样其他类只能包含那个应该允许使用的类实现的部分?

----以下是我希望实施的具体细节: ----不是必读的!

无论如何,我正在创建一个实体组件系统。我想按如下方式构建它:

有一个'EntityPool'对象主要作为实体及其组件的内存存储/管理器存在。我想从我的'Game'类中获得指定的访问级别(例如,构建/破坏池的能力,以及访问组件数组的能力,以及迭代所有'可渲染'组件的能力)。

有一个'EntityFactory'基类,我希望对实体池有更大程度的访问权限。它将被'Game'类用于如下:

GruntEntityFactory ef(&EntityPool); //GruntEntityFactory inherits from EntityFactory 
ef.produce();

然后,实体工厂将使用其对实体池的访问权来创建必要的组件并将其放置到位。

这里需要注意的是,“游戏”只能访问创建EntityPool并读取其内容,但无法直接更改其内容。另一方面,我想继承EntityFactory的所有东西,我想提供管理EntityPool内容的权限。

有没有办法可以在每个文件中包含不同的EntityPool标头,这样每个文件只能“知道”它可以访问的功能?这是最好的方法吗(假设有可能)?

此外 - 我意识到这与EntityPool和EntityFactories紧密结合。那是故意的。而且,我想不必列出我在EntityPool中作为朋友类制作的每个EntityFactory。

谢谢!

澄清的示例代码

//In my Game Class
#include "entitypool.h"
#include "entityfactory_grunt.h"

...

EntityPool ep(); //Construct an EntityPool
GruntEntityFactory gef(&ep); //Pass an EntityPool pointer to an EntityFactory
gef.produce(); //Call produce on GruntEntityFactory, and have it add appropriate components to the EntityPool

//I would like this next line to not be allowed. Game shouldn't be able to 
//directly manipulate the components/ other internal EntityPool structure.
//However, I WOULD like EntityFactories to retain the ability to do so.
//(otherwise, how would EntityFactory.produce() work?)
ep.addComponent(PhysicsComponent pc(1, 2, 3)); 

//I WOULD like Game to be able to access certain functions of EntityPool
for(int i = 0; i < ep.numPhysicsComponents; i++)//Like the count of entities
    physicsSolver.update(ep.physicsComponents[i]);//And the ability to update/render components

确定。所以希望这是一个足够明智的例子来了解我想要的东西。标题的原因是我对如何实现这一目标的第一个直觉是拥有2个头文件。

//EntityPool_GameAccess.h
//This file would contain prototypes for the functions utilized by Game, but NOT the ones
//that game is not allowed to see.

class EntityPool
{
    public:
        int numPhysicsComponents();
        PhysicsComponent getPhysicsComponent(int i);
};

//EntityPool_FactoryAccess.h
//This file would contain prototypes for the functions that only ought be used
//by classes specifically built to manipulate entitypool

class EntityPool
{
    public:
        void addPhysicsComponent(PhysicsComponent pc);
        int numPhysicsComponents();
        PhysicsComponent getPhysicsComponent(int i);
};

显然这些例子是简化的。希望我仍然可以理解:我想要一个具有某些类可访问的某些函数的类,以及其他类可以访问的其他函数。

1 个答案:

答案 0 :(得分:0)

确定。我终于在StackOverflow上的另一个问题中找到了答案:Making classes public to other classes in C++

帕特里克回答的底部:

  

不幸的是,C ++中没有办法只将一部分类公开给一组有限的其他类。