有没有办法防止一个特定对象在另一个对象仍然存在时被销毁,而无需明确地让第二个对象的类知道第一个对象?
这是一个例子:
class A { /* A creates B*/ };
class B {};
int main() {
auto spA = std::make_shared<A>();
auto spB = spA->getB();
spA.reset();
spB->DoSomething();
}
之后spA.reset()
,我希望至少有一个对指向的对象的引用spA
。或者,换句话说:我spA
只想在调用spB->DoSomething()
.
但是,一个重要的先决条件是B
不允许“知道”的A
(例如,不允许持有指向它的指针/引用)。
据我了解,共享指针提供了一些可以帮助解决此问题的功能,但我不确定是哪一个。
编辑:
A
的简要结构B
如下:
class A
{
public:
A()
{
m_B = B::FactoryB();
}
std::shared_ptr<B> getB()
{
return m_B;
}
private:
std::shared_ptr<B> m_B;
};
class B
{
public:
static std::shared_ptr FactoryB()
{
return std::make_shared<B>();
}
};
EDIT2(我的解决方案):
因此,使用@MSalters 提供的建议,我能够找到适合我的解决方案。在这种情况下,它比预期的要简单得多,因此我只需要调整A::getB()
:
std::shared_ptr<B> getB()
{
std::shared<B> spBAlias(this->shared_from_this(), m_B.get());
return spBAlias;
}
m_B
在这里,不仅仅是返回,而是创建并返回一个类型A::getB()
的共享指针(使用别名构造函数),这会影响对象的引用计数(由 提供)。因此,调用从二到一的使用减少,使调用成为可能。要使用,需要继承自:spBAlias
B
A
this->shared_from_this()
spA.reset()
main
spA
spB->DoSomething()
shared_from_this()
A
std::enable_shared_from_this<A>
class A : public std::enable_shared_from_this<A> { /* ... */ }