【发布时间】:2017-10-25 22:19:16
【问题描述】:
我有一个主函数,它接受一个类对象的引用并尝试通过foo() 和bar() 更新它,但是,bar() 只允许传递到 shared_ptr 类型。假设我不允许修改 bar() 的签名,我如何保证它的行为符合预期。
void foo(MyStruct& s) {
modifyS(s);
}
void bar(std::shared_ptr<MyStruct> s) {
modifySAgain(s);
}
mainFunction(MyStruct& s) {
foo(s);
// bar(?) how should I do here such that s would be modified by bar()
// bar(std::make_shared<Mystruct>(std::move(s)) ?
}
【问题讨论】:
-
如果允许您更改
bar的签名,那么为什么不把void bar(MyStruct& s)改成foo一样呢? -
您期望什么行为?您应该能够在这两种情况下修改对象。
-
bar实际上需要std::shared_ptr才能正常工作,或者它只需要MyStruct&才能正常工作。如果是后者,bar写错了,应该修复。 -
如果您的问题有低级技术解决方案,它可能涉及
enabled_shared_from_this。也就是说,我认为设计是这里的问题。如果 bar 需要所有权,并且mainFunction调用 bar,那么传递性地mainFunction也需要所有权。但无论如何,免费函数应该很少需要拥有所有权。
标签: c++ c++11 pass-by-reference smart-pointers