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是的,对,复制粘贴错误。非常感谢。