Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++;减少指针(原始指针或其他指针)的使用和/或返回可为空的非指针 P>我用OpenGL编写C++游戏,并决定编写一个基于组件的系统,非常类似于Ungine或不真实引擎——为了好玩,并学习这些系统是如何工作的。我已经到了需要实现组件和游戏对象的地步,我已经非常成功地实现了_C++_Pointers_Reference_Raw Pointer - Fatal编程技术网

C++;减少指针(原始指针或其他指针)的使用和/或返回可为空的非指针 P>我用OpenGL编写C++游戏,并决定编写一个基于组件的系统,非常类似于Ungine或不真实引擎——为了好玩,并学习这些系统是如何工作的。我已经到了需要实现组件和游戏对象的地步,我已经非常成功地实现了

C++;减少指针(原始指针或其他指针)的使用和/或返回可为空的非指针 P>我用OpenGL编写C++游戏,并决定编写一个基于组件的系统,非常类似于Ungine或不真实引擎——为了好玩,并学习这些系统是如何工作的。我已经到了需要实现组件和游戏对象的地步,我已经非常成功地实现了,c++,pointers,reference,raw-pointer,C++,Pointers,Reference,Raw Pointer,我的实现工作。。。这不是我想要的。 目前,我将组件存储为指向组件的指针的私有向量,并在请求时返回组件 示例: GetComponent<MeshRenderer>(); //Returns "MeshRenderer" Component as MeshRenderer* AddComponent(new MeshRenderer(mesh)); //Adds component to vector + returns MeshRenderer* GetComponent()//将

我的实现工作。。。这不是我想要的。 目前,我将组件存储为指向组件的指针的私有向量,并在请求时返回组件

示例:

GetComponent<MeshRenderer>(); //Returns "MeshRenderer" Component as MeshRenderer*
AddComponent(new MeshRenderer(mesh)); //Adds component to vector + returns MeshRenderer*
GetComponent()//将“MeshRenderer”组件作为MeshRenderer返回*
AddComponent(新网格渲染器(网格))//将组件添加到vector+渲染器*
这些组件是抽象类,并由诸如网格渲染器之类的组件进行扩展

T *AddComponent(T *component)
{
    component->parent = this;
    m_components[typeid(T).name()] = component;

    bool pushLocation = true;
    for (unsigned int i = 0; i < m_component_locations.size(); i++)
        if (m_component_locations.at(i) == typeid(T).name())
            pushLocation = false;
    if(pushLocation)
        m_component_locations.push_back(typeid(T).name());
    return GetComponent<T>();
}
T*添加组件(T*组件)
{
组件->父级=此;
m_components[typeid(T).name()]=组件;
bool-pushLocation=true;
对于(无符号整数i=0;i
上图:我的AddComponent();代码,用于添加组件-需要指向组件的指针

std::unordered_map<std::string, Component*> m_components; //Holds the components
std::vector<std::string> m_component_locations; //Holds data on components, allows them to be indexed
std::无序映射m_组件//保存组件
std::向量m_分量位置//保存组件上的数据,允许对其进行索引
上图:我如何在GameObject类中存储我的组件,允许我通过索引循环它们

这种方法的问题在于如何实现GetComponent()函数。它返回一个指向该组件的指针,如果不存在这样的组件,则可能返回一个null ptr

T *GetComponent()
{
    if (m_components.count(typeid(T).name()) != 0)
    {
        return static_cast<T*>(m_components[typeid(T).name()]);
    }
    else
    {
        return nullptr;
    }
}
T*GetComponent()
{
if(m_components.count(typeid(T).name())!=0)
{
返回静态_cast(m_组件[typeid(T).name()]);
}
其他的
{
返回空ptr;
}
}
我的问题是,由于返回指针,我可以调用delete并删除指针。这些都是原始指针,但我已经确保它们在游戏对象被销毁时由程序处理,所以希望(除非我不称职)不要担心内存泄漏,但我更愿意返回一个引用,因为你不能对它们调用“delete”,以避免我可能犯的任何愚蠢错误

我已经将变量设置为私有变量,GameObject处理组件的删除,我不希望由于不称职或类似原因而允许自己删除某些内容

我曾考虑返回一个唯一的_ptr,但我不确定该实现是否更可取


(作为额外说明,我确实需要GetComponent()函数返回某种类型的null或指示不存在此类组件)

您减少使用原始指针的想法是正确的。我认为你必须调查并注意事情是如何实施的。那里根本没有指针

对于您的情况,您必须执行与EntityX相同的操作-创建引用(而不是指针)到您的组件的类
ComponentHandle
。此类不管理组件的生命周期。它只是组件的一个接口。您还可以重载
->
运算符以访问组件中的成员


<> P>幸运的是C++和组件实体系统。<代码> Type ID(t).NAME())/Cord>你不应该以任何方式依赖它,只用于调试目的,因为没有保证这是什么样的好,你有什么建议我可以改变它的相同用途,但不依赖于代码> Type ID(t)。
?您可以使用散列码或
std::type_index
,请参见注释下的内容:由于您提到了
唯一的\u ptr
,我要提到的是还有
共享的\u ptr
(在C++11中);可能有兴趣,也可能没有兴趣这会更好吗<代码>标准::类型索引(类型ID(T))已经很晚了,所以我只浏览了类型索引的文章,但我会在明天仔细检查。EntityX的解决方案正是我所需要的,谢谢。@Freak\y这听起来有点像
标准::参考包装器
,也许你也应该喜欢它。