我必须在对象创建时将其注册到容器中。 如果没有智能指针,我会使用类似于以下内容的代码:
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;
}
这样做可以吗?还是说有标准的程序需要遵循?编辑:实际上我的情况更复杂。我有两个对象需要相互维护指针。所以事实上,我不是在“注册”,而是创建另一个对象(比如b_class),它需要
this
作为参数。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
需要一个智能指针?通常情况下,如果一个对象不管理自己的生命周期(也就是假设或要求它将由智能指针持有),会更加清晰简洁。创建该对象的部分应该决定分配策略,静态、自动、由智能指针管理的动态分配等等。如果你能够将注册和所有权分开,那就更好了。 - CB Bailey