c++组件系统问题
C++ Component System Issue
我试图得到一个小的实体/组件系统在c++中工作。到目前为止还好,没有太多问题,但我面临一个问题。
下面是我当前的代码:
class Entity {
public:
// [...]
template<typename T, typename ...Args>
bool AddComponent(Args... args) {
std::type_index tid = std::type_index(typeid(T));
if (_Components[tid] == nullptr) {
_Components[tid] = std::make_shared<T>(args...);
return true;
}
return false;
}
template<typename T>
std::shared_ptr<T> GetComponent() {
// Issue here
std::type_index tid = std::type_index(typeid(T));
return std::dynamic_pointer_cast<T>(_Components[tid]); // return nullptr if no component
}
template<typename T>
bool RemoveComponent() {
std::type_index tid = std::type_index(typeid(T));
if (_Components.erase(tid) == 1) return true;
return false;
}
private:
std::map<std::type_index, std::shared_ptr<Component>> _Components;
};
如上所示,它非常简单,每个组件都派生自一个基类Component
,并按如下方式使用:
class Component;
class MyComponent: public Component {
// [...]
MyComponent(int foo_): foo(foo_) {}
int foo;
}
Entity e;
e.AddComponent<MyComponent>(42);
std::cout << e.GetComponent<MyComponent>()->foo; // 42
e.RemoveComponent<MyComponent>();
std::cout << e.GetComponent<MyComponent>()->foo; // Error
错误是逻辑的,我理解为什么,但我的问题是如何防止调用已被删除的Component
时出现错误,因此是nullptr
而不会使程序崩溃?
一个简单的try/catch就足够了吗?如何在这里实现呢?
您可以检查指针:
auto ptr = e.GetComponent<MyComponent>();
if(ptr) ptr->foo();
或添加HasComponent
方法:
template<typename T>
bool HasComponent() {
std::type_index tid = std::type_index(typeid(T));
return _Components.find(tid) != _Components.cend();
}
你也可以修改GetComponent
,这样它就不会在地图中插入nullptr
:
template<typename T>
std::shared_ptr<T> GetComponent() {
std::type_index tid = std::type_index(typeid(T));
return (_Components.find(tid) == _Components.cend()) ? nullptr : std::dynamic_pointer_cast<T>(_Components[tid]);
}
相关文章:
- 有关纯 ECS(实体组件系统)和更新系统的问题
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- C++ 本征线性系统求解,数值问题?
- LittleFS文件系统,NOR闪存的文件写入问题
- 在C++中读取文件系统时出现问题(Boost 未编译)
- 我有一个关于我的战斗系统HP代码的问题
- 获取“boost::文件系统::p ath”字符指针时出现问题
- 如何解决系统.Zip.TZipFile.ExtractAll无法从.zip文件中提取所有数据的问题
- 字符串问题中的系统( "command" ) 字符串
- std::文件系统和 std::experimental::文件系统问题在不同的编译器中
- 鸟类调查中的项目在代码中遇到问题.如何像数据库系统一样存储数据
- 关于为许可证系统创建密钥生成器的问题
- 正确处理字节对齐问题 - 通过UDP在16位嵌入式系统和32位桌面之间
- 有关继承的项目系统问题
- 编译 boost 文件系统的教程文件时遇到问题
- 使用OpenMP在四核系统上使用4个线程来加速问题
- 与系统功能相关的问题
- 关于安卓系统上的JNI的问题
- Visual studio 2012中针对包含系统变量的IntelliSense问题
- 菜鸟在编码(文本战斗系统)方面存在问题