在这种情况下使用的最佳指针类型是什么

朋友69

我目前正在制作一个小型“游戏引擎”。我想知道是否应该使用智能指针以及应该使用哪种类型。还是我只是为这个 GameObject 类使用原始指针。GameObject 的每个实例都附加了组件变换、精灵等。我应该使用智能指针还是只使用原始指针。因为我从来没有使用过智能指针,当我尝试使用时我总是会遇到一堆错误。使用原始指针可以吗?

游戏对象.h:

class Component;
    class GameObject{
    public:
        GameObject();
        virtual ~GameObject();
        void addComponent(Component* component);
        
        //return the first component of type T
        template<typename T>
        T* getComponent(){
            for(auto component : components){
                if(dynamic_cast<T*>(component)){
                    return dynamic_cast<T*>(component);
                }
            }
        }

        // return the component with the type T
        template<typename T>
        std::vector<T*> getComponents(){
            std::vector<T*> components;
            for(auto component : this->components){
                if(dynamic_cast<T*>(component)){
                    components.push_back(dynamic_cast<T*>(component));
                }
            }
            return components;
        }

        void removeComponent(Component* component);
        
        std::vector<Component*> components;

    };

    //======================================================

    class Component
    {
    private:
    public:
        Component();
        virtual ~Component();
        
        //the game object this component is attached to
        GameObject* gameObject;
        
    };

谢谢阅读。

红波

第一件事。一般来说,早期失败比晚期失败更受欢迎。交付后的失败是灾难性的。最受欢迎的失败形式是在编译时。好的代码试图通过在编译时断言错误来防止运行时或逻辑错误。所以不要被编译错误吓到。接下来,您必须决定对象的生命周期及其所有权。原始指针的主要问题是含义的模糊性。原始指针是否暗示:

  1. 仅供参考
  2. 可选参考
  3. 拥有的资源
  4. 数组开头
  5. PIMPL
  6. ...

很难通过使用原始指针查看代码来判断,这是预期的。编码过程中的混乱会导致各种邪恶(包括资源泄漏、双重删除、释放后使用......)。

另一方面,智能指针将指向对象的用例限制为非常具体的情况(来自上面的列表或其他)。此外,智能指针提供了对象生命周期的保证。标准库为上述不同的用例提供了各种类(智能指针或其他)。

如果这些类都不适合特定用例,我宁愿定义一个包装器来封装指针并装饰其行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在这种情况下使用索引匹配的最佳方法是什么?

在这种情况下,使用IF或SWITCH或“动态函数名称”的最佳实践是什么

在这种情况下,将分支与GIT一起使用的最佳方法是什么

在这种情况下,处理AngularJS中事件的最佳方法是什么?

mysql:在这种情况下索引多列的最佳方法是什么

在这种情况下,最佳的Ruby Class设计/模式是什么?

在这种情况下,绕过“ MemoryError”的最佳方法是什么?

在这种情况下,字符串存储的最佳解决方案是什么?

在这种情况下,避免混乱循环的最佳方法是什么?

询问软件包升级的最佳地点是什么(在这种情况下是 freeglut)?

在这种情况下,最佳的数据库结构是什么?

在这种情况下,非泛型方法不能与类型参数一起使用的含义是什么?

在这种简单情况下,PHP拒绝接受返回类型的背后原因是什么?

> =在这种情况下是什么意思

在这种情况下 res 是什么意思?

在这种情况下,语法[]是什么意思?

在这种情况下,`typedef`是什么意思

在这种情况下,svn更新的流程是什么?

在这种情况下,括号是什么意思?

在这种情况下,运算符“(> =)”是什么?

C ++:在这种情况下引用的优点是什么?

jQuery:在这种情况下,.on()的正确用法是什么?

在这种情况下,熵是什么意思?

在这种情况下setViewControllers的目的是什么

在这种情况下如何使用智能指针

在这种情况下什么类型的秤是合适的

在这种情况下,为什么要使用智能指针?

Angular:在这种特殊情况下使用ng-change的正确方法是什么?

在这种情况下使用GET而不是POST的原因是什么?