C++;组件系统问题 我试图让一个小的实体/组件系统在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; };
错误是合乎逻辑的,我理解其原因,但我的问题是如何在调用已删除的C++;组件系统问题 我试图让一个小的实体/组件系统在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; };,c++,entity,components,C++,Entity,Components,错误是合乎逻辑的,我理解其原因,但我的问题是如何在调用已删除的组件时防止出现错误,因此nullptr不会导致程序崩溃 一次简单的尝试/抓住就足够了吗?这里应该如何实现它?您可以检查指针: auto ptr = e.GetComponent<MyComponent>(); if(ptr) ptr->foo(); 您还可以修改GetComponent,这样它就不会在映射中插入nullptr: template<typename T> std::shared_ptr&l
组件时防止出现错误,因此nullptr
不会导致程序崩溃
一次简单的尝试/抓住就足够了吗?这里应该如何实现它?您可以检查指针:
auto ptr = e.GetComponent<MyComponent>();
if(ptr) ptr->foo();
您还可以修改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]);
}
模板
std::shared_ptr GetComponent(){
std::type_index tid=std::type_index(typeid(T));
return(_Components.find(tid)=_Components.cend())?nullptr:std::dynamic_pointer_cast(_Components[tid]);
}
您可以检查指针:
auto ptr = e.GetComponent<MyComponent>();
if(ptr) ptr->foo();
您还可以修改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]);
}
模板
std::shared_ptr GetComponent(){
std::type_index tid=std::type_index(typeid(T));
return(_Components.find(tid)=_Components.cend())?nullptr:std::dynamic_pointer_cast(_Components[tid]);
}
我想我别无选择,只能每次检查组件是否存在!还有一件小事,不应该HasComponent
返回布尔值而不是std::shared\u ptr
?@Usiten是的,对,复制粘贴错误。谢谢。我想我别无选择,只能每次检查组件是否存在!还有一件小事,不应该HasComponent
返回布尔值而不是std::shared\u ptr
?@Usiten是的,对,复制粘贴错误。非常感谢。