- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个游戏引擎。
假设它包含类Graphic、GamePlay 和Physics 系统。
(真实案例是20+系统。)
这三个都是从System派生的。
这是简单初始化的草稿。
main(){
Game_Engine* engine = new Game_Engine();
Graphic* sys1= new Graphic(engine); //set to System::engine_pointer
GamePlay* sys2= new GamePlay(engine);
Physics* sys3= new Physics(engine);
engine->addSystem(sys1); //add to Game_Engine's hash map
engine->addSystem(sys2);
engine->addSystem(sys3);
}
然后,我想让所有系统都可以互相调用。前任。 Graphic可以调用GamePlay。
所以我将 addSystem() 设计为:-
class Game_Engine {
std::unordered_map<std::type_index,Sys*> hashTable;
void addSystem (System* system){
hashTable.add( std::type_index(typeid(*system)), system );
}
template <class SysXXX> SysXXX* getSystem(){
return hashTable.get(std::type_index(typeid(SysXXX)) );
}
}
结果是每个System可以只用类名互相调用:-
class Graphic : public System {
void call_me_every_time_step(){
engine_pointer->getSystem<GamePlay>()->... do something ;
}
}
现在,它如我所愿,但是
听说 typeid 对性能不好。
Game_Engine.h 现在必须 #include 所有 Graphic.h、GamePlay.h 和 Physics.h ,因此编译时间增加。
(我试图不包括它们 -> 3 个派生系统的 typeid 将返回错误的结果。)
是否可以避免这些缺点?怎么样?
还有其他缺点吗?
这首先是一个糟糕的设计吗?如果是这样,什么是好的设计?(因为我在 C++ 方面的经验非常有限。)
编辑 1:下面部分对 gudok 的回答的回应
为每个系统添加一定的get/set函数是我做的。
但是,我意识到,当系统越多时,管理就越难,至少对我而言是这样。
我避开了它,改用了模板代码,如上所述。
对于gudok的解决方案,单个系统会增加程序员的工作量如下:-
对比题中的代码,单个系统只需1行。
engine->addSystem(new Graphics(engine));
这不是那么微不足道,尤其是当大多数系统都在更名,系统数量不断增加时。
编辑 2:对 gudok 增强答案的回应
使 GameEngine 派生自 SystemHolder{T} 可以将每个 System 的工作减少到 2 个地方:-
: public SystemHolder<Graphics>
和
engine.addSystem<Graphics>(new Graphics());
不过还是2个地方。
有问题的代码只使用了 1 个地方。
因此,它还不够好,但感谢您的尝试!
最佳答案
为什么要使用 hash map 和 typeids 而不是在 GameEngine 中单独存储每个系统?从语义上讲,所有这些系统都做不同的事情。我宁愿做以下事情:
class GameEngine {
std::vector<System*> systems;
Graphics* graphics;
Gameplay* gameplay;
Physics* physics;
void setGraphics(Graphics* graphics) {
this->graphics = graphics;
this->systems.push_back(graphics);
}
Graphics* getGraphics() {
return this->graphics;
}
...
};
这个解决方案背后的想法是:
Graphics
的函数而不是所有功能都通用 System
秒。单独存储每个系统可以消除类型标识和不必要的类型转换的必要性。当您需要以某种统一的方式处理所有系统时(例如,提前游戏时间),您可以使用 systems
领域:
for (auto it = systems.begin(); it != systems.end(); it++) {
it->tick();
}
编辑 这是增强的解决方案。您通过另外继承 GameEngine
添加新系统来自 SystemHodler
.获取和设置特定 System
的实例使用 getSystem<T>
是统一的和 setSystem<T>
方法——如您所愿。
#include <vector>
class System {
public:
virtual ~System() {}
};
class Graphics : public System {};
class Physics: public System {};
template<typename T>
class SystemHolder {
public:
T* getSystem() { return system; }
void setSystem(T* system) { this->system = system; }
private:
T* system;
};
class GameEngine: public SystemHolder<Physics>, public SystemHolder<Graphics> {
public:
template<typename T>
inline void addSystem(T* system) {
systems.push_back(system);
SystemHolder<T>::setSystem(system);
}
template<typename T>
inline T* getSystem() {
return SystemHolder<T>::getSystem();
}
private:
std::vector<System*> systems;
};
int main(int argc, char* argv[]) {
GameEngine engine;
engine.addSystem<Physics>(new Physics());
engine.addSystem<Graphics>(new Graphics());
engine.getSystem<Physics>();
engine.getSystem<Graphics>();
}
关于c++ - 一个程序有很多系统(类)。使系统可以通过类名调用其他人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37298601/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!