gpt4 book ai didi

c++ - std::shared_ptr 这个

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

我目前正在尝试学习如何使用智能指针。然而,在做一些实验时,我发现了以下情况,我找不到令人满意的解决方案:

假设您有一个 A 类对象是 B 类对象(子对象)的父对象,但两者应该彼此认识:

class A;
class B;

class A
{
public:
void addChild(std::shared_ptr<B> child)
{
children->push_back(child);

// How to do pass the pointer correctly?
// child->setParent(this); // wrong
// ^^^^
}

private:
std::list<std::shared_ptr<B>> children;
};

class B
{
public:
setParent(std::shared_ptr<A> parent)
{
this->parent = parent;
};

private:
std::shared_ptr<A> parent;
};

问题是 A 类的对象如何将自己的 std::shared_ptr (this) 传递给它的子对象?

有 Boost 共享指针 (Getting a boost::shared_ptr for this) 的解决方案,但是如何使用 std:: 智能指针来处理这个问题?

最佳答案

std::enable_shared_from_this只是为了这个目的。你继承它,你可以调用.shared_from_this()从类内部。此外,您在此处创建可能导致资源泄漏的循环依赖项。这可以通过使用 std::weak_ptr 来解决。 .所以你的代码可能看起来像这样(假设 child 依赖 parent 的存在而不是相反):

class A;
class B;

class A
: public std::enable_shared_from_this<A>
{
public:
void addChild(std::shared_ptr<B> child)
{
children.push_back(child);

// like this
child->setParent(shared_from_this()); // ok
// ^^^^^^^^^^^^^^^^^^
}

private:
// note weak_ptr
std::list<std::weak_ptr<B>> children;
// ^^^^^^^^
};

class B
{
public:
void setParent(std::shared_ptr<A> parent)
{
this->parent = parent;
}

private:
std::shared_ptr<A> parent;
};

但是请注意,调用 .shared_from_this() 要求 this 在调用点归 std::shared_ptr 所有。这意味着您不能再在堆栈上创建这样的对象,并且一般不能从构造函数或析构函数中调用 .shared_from_this()

关于c++ - std::shared_ptr 这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711034/

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