std::shared_ptr of this
std::shared_ptr of this
我目前正在学习如何使用智能指针。然而,在做一些实验时,我发现了以下情况,我无法找到令人满意的解决方案:
假设你有一个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共享指针有解决方案(为this
获取boost::shared_ptr
),但如何使用std::
智能指针来处理此问题?
std::enable_shared_from_this
就是为了这个目的。您从中继承,并且可以从类内部调用.shared_from_this()
。此外,您在这里创建了可能导致资源泄漏的循环依赖关系。这可以通过使用std::weak_ptr
来解决。所以您的代码可能是这样的(假设孩子依赖于父母的存在,而不是相反):
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()
。
您在设计中遇到了一些问题,这些问题似乎源于您对智能指针的误解。
智能指针用于声明所有权。你宣布父母双方都拥有所有的孩子,但每个孩子都拥有自己的父母,这打破了这一点。两者都不可能是真的。
此外,您在getChild()
中返回了一个弱指针。通过这样做,您声明调用者不应该关心所有权。现在,这可能是非常有限的,但也通过这样做,你必须确保当任何弱指针仍然存在时,有问题的孩子不会被破坏,如果你使用智能指针,它会自行解决。
还有最后一件事。通常,当您接受新实体时,通常应该接受原始指针。智能指针对于在父母之间交换子女可能有其自身的含义,但对于一般用途,您应该接受原始指针。
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- Usages of std::move
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 具有变量Number of Arguments的std::函数的矢量
- Capacity of a deque
- C++ "Invalid use of 'this' in non-member function" ,
- Windows 10 环境中的"This version of XAudio2 is available only in Windows 8"错误
- C++ substr 方法 - "invalid use of ‘this’ in non-member function"
- 科学实验室编译"cannot allocate this quantity of memory"
- std::shared_ptr of this
- C++ - definition of (*this)
- 如何抑制此内容 - qglobal.h:320:6: 警告: #warning "This version of Mac OS X is unsupported" ?
- VC++ Winforms自动生成的项目无法调试VS2010:"This Project is out of Date"
- "error: C2275: 'QMouseEvent' : illegal use of this type as an expression"
- 简单的模板化函数,用于转换 std::vectors - "illegal use of this type as an expression"