Autoregister对象列出存储共享指针

时间:2015-06-04 15:19:11

标签: c++ c++11 shared-ptr

我想实现一个基础对象,它可以将自身自动调整为单个对象列表。我会存储指向列表中这些对象的共享指针。在构造函数或单独的初始化函数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();

}

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

  • 我想隐藏用户代码的注册机制,
  • 设置/取消设置功能除了注册
  • 之外还需要其他人员

我怀疑这个问题可能来自设计不足,所以我对设计完全不同的解决方案感兴趣,如果它们可以用于同一目的。

更新:解决方案

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());
    }
};

1 个答案:

答案 0 :(得分:3)

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