提问人:JamalNewtron 提问时间:9/25/2023 最后编辑:OerstedJamalNewtron 更新时间:9/25/2023 访问量:87
std::shared_ptr 由一个类拥有并由另一个类初始化
std::shared_ptr owned by one class and initialized by another class
问:
我有一个类,假设 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空无一人。
答:
0赞
NicholasTNG
9/25/2023
#1
我将使用普通指针重写您的代码,我认为这更清楚会发生什么
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;
要通过更改另一个指针来更改指针,您需要另一个间接级别,但我看不出有一种方法可以在不破坏共享指针之间的想法的情况下做到这一点(即它们是独立的,一个可以没有另一个而存在)。
如果你提供更多关于你想做什么的信息,也许我可以帮到你。
评论
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
我仍然不明白为什么你需要几节课。例如,也许继承也可以完成这项工作。没有关于你的目标的更多信息就不能说。分离已经是一种设计选择。但是,您想要实现的规格和功能是什么?B
A
A
B
评论
m_dataMemberInA
存储(可能)一个.在构建 B 时,您存储在 .与 A 没有任何联系。当您调用时,现在存储一个地址,但地址为 nullptr。nullptr
nullptr
m_dataMemberInB
anotherMethod
m_dataMemberInB
m_dataMemberInA
int* a = nullptr; int* b = a; b = new int(32);
a