如何在标头包含中调用函数?

时间:2018-11-08 08:30:27

标签: c++ game-engine c++17

我正在研究制作2D游戏的简单框架。它使用的组件和系统会因游戏而异。

为了使引擎的其他部分更容易遍历所有可能的系统和/或组件,我希望它们在其中一个被包含时就让自己知道(每个都有自己的头文件),以一种创建所有可能的组件类型和系统类型的列表的方式。

我目前已通过在系统或组件定义之后的底部放置一个Register结构来解决此问题,并将该组件/系统指针作为参数传递给Register结构的构造函数,即:

std::vector<Component*> Components    
struct Register{
    Register(Component* newComponent){
        Components.push_back(newComponent);
    }
}

然后将其用于每个组件标题的底部:

 Register 2DPosReg(&2DPos);

请确保在进入主代码之前,所有组件都在“组件”中列出。我也以同样的方式将这些组件的名称和其他一些细节添加到某些全局向量中。 但是,创建一个永远不会仅仅用于执行其构造函数中的代码的临时对象似乎不必要地麻烦。

还有其他方法可以使包含标头的其他代码“自己知道”吗?

我想避免以前的解决方案,因为我有一个较长的Register(&2DPos,&Vel,&Acc,... etc)函数,该函数可以注册所有选项,因为对使用过的组件所做的任何更改都需要重新编辑功能。

(另外,第一个stackoverflow问题,如果很长很久/有初学者的错误,我们道歉)

1 个答案:

答案 0 :(得分:4)

  

但是,创建一个永远不会仅仅用于执行其构造函数中的代码的临时对象似乎不必要地麻烦。

您对解决方案的美学品质的评估是正确的。不幸的是,C ++没有更好的机制来完成您追求的目标。

毕竟,当C ++标准库想要插入头文件后执行代码时,甚至必须employ this technique

但是,由于您确实标记了此C ++ 17,并且打算将对象声明放在标头中,因此需要将其声明为内联变量:

inline Register whatevs(...);

每个头文件应该生成一个对象。