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

std::shared_ptr owned by one class and initialized by another class

提问人:JamalNewtron 提问时间:9/25/2023 最后编辑:OerstedJamalNewtron 更新时间:9/25/2023 访问量:87

问:

我有一个类,假设 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++(英语:C++) 初始化 共享 PTR 所有权

评论

0赞 Oersted 9/25/2023
m_dataMemberInA存储(可能)一个.在构建 B 时,您存储在 .与 A 没有任何联系。当您调用时,现在存储一个地址,但地址为 nullptr。nullptrnullptrm_dataMemberInBanotherMethodm_dataMemberInBm_dataMemberInA
1赞 molbdnilo 9/25/2023
所以,用“原始指针”的术语来说,你期望如果你这样做,那么不会是空的吗?int* a = nullptr; int* b = a; b = new int(32);a
0赞 pptaszni 9/25/2023
即使这在技术上是可行的,例如有参考资料,也请不要这样做
2赞 molbdnilo 9/25/2023
爱丽丝和鲍勃(可能还有更多人)共用一辆自行车。鲍勃不想再分享那辆自行车了,所以他买了一辆新自行车(他准备分享)。第一辆自行车是否仍然存在并属于爱丽丝和其他人,还是消失了,成为包括鲍勃在内的所有人共享的新自行车?
0赞 JamalNewtron 9/25/2023
谢谢你的精彩解释。这很有道理。现在的问题是,我希望 A 类成为实例的所有者,但 B 类应该填充指针。有没有好的方法?传递指针作为参考?std::shared_ptr<SomeType>& ??

答:

0赞 NicholasTNG 9/25/2023 #1

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

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

正如你所看到的,这只是改变了 B 中的指针,而没有改变 A 中的指针。由于只是 的副本,因此更改有关指针本身的任何内容都不会更改有关其他指针的任何内容。如果 中已经有一个对象,则可以通过 更改指向对象。这会将指向对象更改为对象。m_dataMemberInBm_dataMemberInAm_dataMemberInA*m_dataMemberInB = otherObject;

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

如果你提供更多关于你想做什么的信息,也许我可以帮到你。

评论

0赞 JamalNewtron 9/25/2023
谢谢!从架构的角度来看,我有一个 Main-Class A。我希望 Main-Class 是上述成员变量的唯一所有者。但 Main-Class 不应构建m_dataMemberInA。因此,我有一个“较低”的 B 类。B 类的结果存储在 m_dataMemberInB 中。之后,主类 A 调用其他类来进一步处理m_dataMemberInA...这有帮助吗?
0赞 Oersted 9/25/2023
我仍然不明白为什么你需要几节课。例如,也许继承也可以完成这项工作。没有关于你的目标的更多信息就不能说。分离已经是一种设计选择。但是,您想要实现的规格和功能是什么?BAAB