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