std::shared_ptr 由一个类拥有并由另一个类初始化

问题描述 投票:0回答:1

我有一个类,比如说A。类A有一个类型为的成员变量:

std::shared_ptr<SomeType> m_dataMemberInA

我没有初始化 A 类中的成员。在 B 类中我也有一个

std::shared_ptr<SomeType> m_dataMemberInB

作为成员变量。在 B 类的初始化程序中,我链接了两个指针:

B::B(std::shared_ptr<SomeType> passedFromA)  : m_dataMemberInB{passedFromA}
{
...
}

在B的另一个函数中,我想初始化shared_ptr:

void B::anotherMethod()
{
m_dataMemberInB = std::make_shared<SomeType> (arguments...);

}

但是 m_dataMemberInA 仍然是空的! -> 由于 m_dataMeberInA 和 m_dataMemberInB 指向相同的内存,我希望每当 m_dataMemberInB 变得有效时,相同的内容应该适用于 m_dataMemberInA?!?!?

尝试在另一个类中初始化m_dataMemberInA。但 m_dataMemberInA 却是空的。

c++ initialization shared-ptr ownership
1个回答
0
投票

我将使用普通指针重写你的代码,我认为这会更清楚,会发生什么

B::B(SomeType* passedFromA)  : m_dataMemberInB{passedFromA}
{
...
}
void B::anotherMethod()
{
    m_dataMemberInB = new SomeType(arguments...);
}

如您所见,这只是更改了 B 中的指针,而没有更改 A 中的指针。由于

m_dataMemberInB
只是
m_dataMemberInA
的副本,因此更改指针本身的任何内容都不会更改其他指针的任何内容。如果
m_dataMemberInA
中已经存在一个对象,则可以通过
*m_dataMemberInB = otherObject;
更改指向的对象。这会改变指向的对象。

要通过更改另一个指针来更改指针,您需要另一级间接,但我没有找到一种方法可以在不破坏共享指针之间的想法的情况下做到这一点(即它们是独立的,并且一个可以在没有另一个的情况下存在)。

如果您提供有关您想要做什么的更多信息,也许我可以帮助您。

© www.soinside.com 2019 - 2024. All rights reserved.