通过对象处理程序删除对象

时间:2015-12-14 19:39:57

标签: c++ pointers object memory-management vector

我有一个object_handler类,负责处理存储在其vector中的对象。

class object_handler {
    private:
        std::vector<object*> m_objects;
        // ...

    public:
        void add(object* x_object);
        void remove(object* x_object);
        void update();
        void render();
        // ...
    };

对象类是我将在游戏中使用的基本实体,现在我需要它做的是它能够在需要时自行删除(例如,当它的健康状况低于零时)。我认为它可行的一种方法是,如果我给对象一个指向其处理程序的指针,以便他们可以访问其处理程序的删除功能,但结果却是一场灾难:编译器开始抛出怪异的东西错误(例如&#34;期望;在*之前&#34; object_handler * m_handler&#34;&#34;),我猜它是因为它们包括彼此。

存储游戏对象和处理删除的正确方法是什么?如果对象在记住向量的同时可以自行删除,那将是最有益的。

另一种方式我虽然它会起作用,但是如果对象会自行删除并且向量会遇到空指针并将其删除但我不知道它会有多好。

2 个答案:

答案 0 :(得分:1)

我通常在removed类中使用标记Entity(true或false)。我可以在主循环中删除它们。

对象移除本身的示例也应该没问题,因为您可以转发声明一个类以打破循环包含。但我不建议这样做,因为它会删除对象的删除时间和位置。

答案 1 :(得分:0)

您描述的错误听起来像您可能想要使用前向声明而不是完整包含。这将允许您使object_handler类和object类通过头文件中定义的接口中的引用或指针相互引用。实际的完整包含只需要包含在实现(.cpp)文件中,并且包含的​​顺序在那里并不重要。例如:

档案object_handler.h

#include <vector>

// NOTE: No #include here for object class,
//       only a forward reference

class object;

class object_handler {
private:
    std::vector<object*> m_objects;
    // ...

public:
    void add(object* x_object);
    void remove(object* x_object);
    void update();
    void render();
    // ...
};

档案object.h

// NOTE: No #include here for object_handler class,
//       only a forward reference

class object_handler;

class object {
public:
    object(object_handler& handler);
    ~object();

private:
    object_handler&  m_handler;
};

档案object.cpp

// NOTE: #include both headers, order doesn't matter

#include "object.h"
#include "object_handler.h"

object::object(object_handler& handler) :
    m_handler(handler)
{
    m_handler.add(*this);
}
object::~object()
{
    m_handler.remove(*this);
}

这是否是管理object实例的合适方式取决于您的其余代码。上述方法并不罕见。您可能希望探索Qt的QObject层次结构等示例,这些示例具有与您类似的类(例如,请参阅QObjectCleanupHandler)。