【发布时间】:2011-03-24 23:34:31
【问题描述】:
我必须在创建容器时在容器中注册一个对象。 如果没有智能指针,我会使用这样的东西:
a_class::a_class()
{
register_somewhere(this);
}
对于智能指针,我应该使用shared_from_this,但我不能在构造函数中使用它。
有没有干净的方法来解决这个问题?在类似的情况下你会怎么做?
我正在考虑引入一个 init 方法,以便在创建后立即调用并将所有内容放入工厂函数中,如下所示:
boost::shared_ptr<a_class> create_a()
{
boost::shared_ptr<a_class> ptr(new a_class);
ptr->init();
return ptr;
}
在这种情况下可以遵循标准程序吗?
编辑:其实我的情况更复杂。我有 2 个对象,它们应相互维护指针。所以事实是我不是在“注册”,而是创建另一个需要this 作为参数的对象(比如说b_class)。 b_class 接收 this 作为弱指针并存储它。
我添加这个是因为你给了我设计建议(非常感谢),至少你可以知道我在做什么:
a_class::a_class()
{
b = new b_class(this);
}
在我的程序中,a_class 是一个实体,b_class 是代表状态的具体类之一(在构造函数中它只是起始状态)。 a_class 需要一个指向当前状态的指针,b_class 需要操纵实体。
a_class 负责创建和销毁 b_class 实例,因此为它们维护一个 shared_ptr 但b_class 需要操纵a_class 并因此维护一个弱指针。 a_class 实例“存活”b_class 实例。
您是否建议在这种情况下避免使用智能指针?
【问题讨论】:
-
我看不到你的代码,但显而易见的问题是为什么
register_somewhere需要智能指针?如果一个对象不管理自己的生命周期,它通常会更干净(这是假设或要求它将由智能指针持有是楔形的细端)。无论是创建对象,都应该根据分配策略来决定,静态的、自动的、由智能指针管理的动态等。如果可以将注册和所有权分开,那就更好了。 -
简单解决方案:sourceforge.net/projects/shared-from-this-ctor/