假设我有一个类,我希望用户能够引用我的一个成员.哪个更受欢迎?
class Member; class ClassWithWeakPtr { private: boost::shared_ptr_member; public: boost::weak_ptr GetMember(); };
要么
class Member; class ClassWithCppReference { private: Member _member; public: Member& GetMember() {return _member;} };
你怎么看?什么时候比另一个更好?
为什么不回来shared_ptr<>
?那么客户端可以根据需要使用返回的内容,但是如果"服务器"类消失则没有问题.
没有太多情况下语义weak_ptr<>
很有意义(缓存和???).通常当客户要求某事时,它希望拥有由客户自己确定的那个东西(并且共享所有权和完全所有权一样好).
如果你有一个情况,可以在不知道客户端的情况下销毁'server'对象(你可能想要的情况use weak_ptr<>
或者shared_ptr<>
),你可以做的最糟糕的事情是返回对成员的引用.在这种情况下,客户端无法知道访问返回的引用是否安全.您必须返回该成员的副本或智能指针,该指针可以正确地管理所返回成员的生命周期.
请记住,如果有一个表达式产生一个临时表ClassWithCppReference
(并不总是很明显),那么调用的客户端GetMember()
甚至不能在下一个语句中使用返回的引用.