如何返回指向不可修改底层对象的std::unique_ptr?
解决方案
给你几个合理的实现方式,按需选择:
方案一:返回const裸指针(最贴合原有语义)
直接从内部的std::unique_ptr中取出const裸指针返回,完全沿用原有逻辑,既保证调用者只能访问BigObj的const方法,又不影响MyObj内部修改对象:
class MyObj { private: std::unique_ptr<BigObj> obj_; public: // 调用者拿到const指针,仅能调用BigObj的const方法 const BigObj* GetObj() const { return obj_.get(); } // 内部可以正常修改对象 void ModifyObj() { obj_->NonConstMethod(); } };
这个方案的优势是零学习成本,和原有代码逻辑完全对齐,而且std::unique_ptr的所有权依然由MyObj独占,安全可靠。
方案二:返回std::shared_ptr
如果业务允许共享对象的const访问权,可以把内部的unique_ptr换成shared_ptr,返回shared_ptr<const BigObj>:
class MyObj { private: std::shared_ptr<BigObj> obj_; public: std::shared_ptr<const BigObj> GetObj() const { return obj_; } void ModifyObj() { obj_->NonConstMethod(); } };
这种方式下,调用者拿到的智能指针只能访问BigObj的const方法,而MyObj内部持有的shared_ptr<BigObj>可以正常修改对象。注意这个方案会改变所有权语义,从独占变成共享,适合需要多个对象持有const引用的场景。
方案三:返回const引用(适用于对象非空的场景)
如果MyObj始终保证内部的BigObj不为nullptr,可以直接返回const引用:
class MyObj { private: std::unique_ptr<BigObj> obj_; public: const BigObj& GetObj() const { return *obj_; } void ModifyObj() { obj_->NonConstMethod(); } };
这种方式同样能限制调用者只能调用const方法,且避免拷贝,但要确保obj_永远有效,否则会触发空指针解引用的未定义行为。
内容的提问来源于stack exchange,提问作者MikeS159
相关产品推荐
相关产品推荐

