自动注册对象以列出存储共享指针
Autoregister Objects to list stores shared pointers
我想实现一个基对象,它可以自动注册到一个单例对象列表。我将在列表中存储指向这些对象的共享指针。注册最好发生在构造函数或单独的初始化函数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派生您的对象。
相关文章:
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 如何在共享库的整个生命周期内存储数据
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- Android :需要在 c++ NDK 中创建共享首选项对象并存储一些布尔值
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 我可以有一个与另一个向量共享存储的向量
- 将向量对象存储在共享指针投掷错误中
- 在共享内存中存储许多变量
- 如何使用模板与类缓存(存储)共享_ptr
- 如何在C++的共享内存中存储浮点向量的向量
- 是否可以将多态性类存储在共享内存中
- 多个动态链接库(DLL)是否可以从静态库(LIB)共享线程本地存储
- 如何在共享内存(C++)中存储stl对象
- 如果对象只能通过存储在数组中的共享指针访问,如何调用函数?
- 这是存储 std::分配器状态的正确方法 - 在这种情况下,由 Windows 上的共享内存支持
- 我可以在共享内存中存储lua_State吗?
- 将shared_ptr与通用注册表或共享对象存储一起使用.或不
- 动态提升线程运行存储在具有共享指针的向量中的对象的方法
- C++如何在cpp之间与extern共享常量-错误:指定了存储类
- 自动注册对象以列出存储共享指针