自动注册对象以列出存储共享指针

Autoregister Objects to list stores shared pointers

本文关键字:存储 共享 指针 注册 对象      更新时间:2023-10-16

我想实现一个基对象,它可以自动注册到一个单例对象列表。我将在列表中存储指向这些对象的共享指针。注册最好发生在构造函数或单独的初始化函数set()中。我的问题是,对象不知道它的共享指针。我该如何解决这个问题?

对象:

class Object
{
public:
    Object() {}
    virtual ~Object() {}
    void set()
    {
        // register object, how?
    }   
    void unset() {
        // unregister object, how?
    }
};

对象列表:

#include <memory>
#include <list>
class ObjectPool
{
public:
    void unregisterObject(std::shared_ptr<Object> objPtr) {
        objPtrList.remove(objPtr);
    }
    void registerObject(std::shared_ptr<Object> objPtr) {
        objPtrList.push_back(objPtr);
    }
private:
    std::list<std::shared_ptr<Object> > objPtrList;
};

用法:

int main()
{
    auto objPtr = std::make_shared<Object>();
    objPtr->set();
    objPtr->unset();
}

我不想直接使用容器单例的register/unregister方法,因为

  • 我想隐藏这个注册机制从用户代码,和
  • set/unset函数除了注册
  • 之外,还做其他工作

我怀疑这个问题可能是设计不充分造成的,所以我对完全不同设计的解决方案也很感兴趣,如果它们可以用于相同的目的。

更新:解决方案

从std::enable_shared_from_this:

派生对象
class Object : public std::enable_shared_from_this<Object>
{
public:
    Object() {}
    virtual ~Object() {}
    void set()
    {
        ObjectPool.registerObject(shared_from_this());
    }   
    void unset() {
        ObjectPool.unregisterObject(shared_from_this());
    }
};

从std::enable_shared_from_this派生您的对象。