【发布时间】:2013-11-05 17:13:21
【问题描述】:
我有一个类DevicePointer,它封装了std::shared_ptr<Device>。需要保存指向设备的指针的各种类派生自DevicePointer。在我开始使用shared_ptr 之前,DevicePointer 有一个::Expose() 函数,它将返回一个指向设备的原始指针。现在我使用 shared_ptr 来保存设备指针,我不知道如何返回它。请注意,应该调用 ::Expose 的唯一原因是取消对指针的引用。
这是原来的 Expose 的样子:
Device * Expose() const { return MyDevice; }
并且会像这样使用:
Device::Expose()->ExecuteFunction(a, b, c);
现在MyDevice 是std::shared_ptr<Device>,我不知道如何返回它以解除引用。显而易见的选择是:
std::shared_ptr<Device> Expose() { return MyDevice; }
但我担心性能,尤其是创建一个新的临时std::shared_ptr。所以我需要某种方式说“你可以取消引用这个指针,但你不能复制它”。原始文件仍然需要共享,因为许多对象都会持有对它的引用。
我希望我已经充分表达了我的问题。谢谢。
【问题讨论】:
-
请澄清您的问题。您的函数
Device & Expose()没有返回原始指针,而是返回引用。如果您想从共享指针访问底层指针,您可以使用get方法(参见en.cppreference.com/w/cpp/memory/shared_ptr)。 -
好的,已编辑以减少歧义。现在只返回一个指针。
-
我更新了答案以解释如何防止 MyDevice 没有副本。
-
请问为什么需要暴露底层指针?也就是说,为什么需要这样做:
Device::Expose()->ExecuteFunction(a, b, c),而不是简单地这样做:Device->ExecuteFunction(a, b, c)?请注意,std::shared_ptr将正确处理->运算符。
标签: c++ shared-ptr