Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何调用包含标头的函数?_C++_Game Engine_C++17 - Fatal编程技术网

C++ 如何调用包含标头的函数?

C++ 如何调用包含标头的函数?,c++,game-engine,c++17,C++,Game Engine,C++17,我正在研究一个制作2D游戏的简单框架。它使用不同游戏的组件和系统 为了让引擎的其他部分能够轻松地遍历所有可能的系统和/或组件,我希望它们在包含其中一个系统和/或组件时(每个都有自己的头文件)就让自己知道,这样就可以创建所有可能的组件类型和系统类型的列表 目前,我已经解决了这个问题,在系统或组件定义之后有一个寄存器结构放在底部,将该组件/系统指针作为参数传递给寄存器结构的构造函数,即: std::vector<Component*> Components struct Regi

我正在研究一个制作2D游戏的简单框架。它使用不同游戏的组件和系统

为了让引擎的其他部分能够轻松地遍历所有可能的系统和/或组件,我希望它们在包含其中一个系统和/或组件时(每个都有自己的头文件)就让自己知道,这样就可以创建所有可能的组件类型和系统类型的列表

目前,我已经解决了这个问题,在系统或组件定义之后有一个寄存器结构放在底部,将该组件/系统指针作为参数传递给寄存器结构的构造函数,即:

std::vector<Component*> Components    
struct Register{
    Register(Component* newComponent){
        Components.push_back(newComponent);
    }
}
这确保了在我们进入主代码之前,所有组件都列在组件中。以同样的方式,我还将这些组件的名称和一些其他细节添加到一些全局向量中。 然而,创建一个临时对象似乎不必要的混乱,它永远不会被用来执行构造函数中的代码

是否有任何其他方式可以让代码的其余部分“知道”包含头?

我希望避免我以前的解决方案,因为我有一个长的寄存器(&2DPos,&Vel,&Acc,…等)函数,可以注册所有选项,因为对所用组件的任何更改都需要重新编辑此函数

(还有,第一个问题,如果太长/有初学者的错误,请道歉)

然而,创建一个临时对象似乎不必要的混乱,它永远不会被用来执行构造函数中的代码

您对解决方案美学质量的评估是正确的。不幸的是,C++没有更好的机制来完成你的任务。

毕竟,即使C++标准库在包含头包含后也要对代码进行执行。 不过,由于您确实标记了此C++17,并且打算将对象声明放在标题中,因此需要将其设置为内联变量:

inline Register whatevs(...);

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

IMO您的代码体系结构看起来可疑。代码中的
组件
是什么?现在看来,每种类型只能有一个组件,这似乎不是很有用。或者您正在尝试创建一个类型信息,比如只关心代码中存在哪些类型的组件的系统?正确,这只存储有关可能的组件和系统类型的信息。每个组件都有自己的无序_映射,根据其ID存储在该映射中。顺便说一句,无需道歉。如果更多的第一次尝试者投入到你的问题的措辞上,那么这将是一个更好的地方,这可能是你想要的。这很好,它花费的4或8字节没有什么可担心的。这么便宜,你会考虑这样做的每一个单独的组件。但它属于.cpp文件,而不是.h文件。将重点放在如何打包和发现组件上。共享库(又称dll)和插件名称的配置列表或扫描目录都是显而易见的方法。谢谢!我不知道内联关键字在C++17中的用法,很高兴知道。
inline Register whatevs(...);