gpt4 book ai didi

c++ - 从构造函数调用 shared_from_this

转载 作者:IT老高 更新时间:2023-10-28 12:46:10 26 4
gpt4 key购买 nike

我必须在创建容器时在容器中注册一个对象。如果没有智能指针,我会使用这样的东西:

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 实例。

您是否建议在这种情况下避免使用智能指针?

最佳答案

a_class is responsible for creating and destroying b_class instances

...

a_class instance "survives" b_class instances.

鉴于这两个事实,b_class 应该没有危险。实例可以尝试访问 a_class a_class 之后的实例实例已被销毁为 a_class实例负责销毁b_class实例。

b_class可以只持有指向它关联的指针a_class实例。原始指针不表达任何适合这种情况的所有权。

在这个例子中,a_class是动态创建的,是聚合对象的一部分,等等。无论创建什么 a_classa_class 一样管理它的生命周期管理 b_class 的生命周期它实例化。

例如

class a_class;

class b_class
{
public:
b_class( a_class* a_ ) : a( a_ ) {}
private:
a_class* a;
};

class a_class
{
public:
a_class() : b( new b_class(this) ) {}
private:
boost::shared_ptr<b_class> b;
};

注意,在这个玩具示例中,不需要 shared_ptr ,对象成员也可以正常工作(假设您不复制实体类)。

class a_class
{
public:
a_class() : b( this ) {}
private:
b_class b;
};

关于c++ - 从构造函数调用 shared_from_this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3401032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com