如何修改C++标准库内置函数访问权限?以unique_ptr的get()为例
解决方案:封装自定义只读智能指针
无法直接修改C++标准库内置函数的访问权限,要实现你的需求,最可靠的方式是封装一个只读智能指针包装类,只暴露安全的操作接口,完全隐藏裸指针获取方法,同时阻止所有权转移。
自定义只读智能指针实现
template <typename T> class ReadOnlyUniquePtr { private: const std::unique_ptr<T>& m_inner_ptr; // 禁止拷贝、移动,避免所有权意外转移 ReadOnlyUniquePtr(const ReadOnlyUniquePtr&) = delete; ReadOnlyUniquePtr& operator=(const ReadOnlyUniquePtr&) = delete; ReadOnlyUniquePtr(ReadOnlyUniquePtr&&) = delete; ReadOnlyUniquePtr& operator=(ReadOnlyUniquePtr&&) = delete; public: // 构造函数:接收const unique_ptr引用 explicit ReadOnlyUniquePtr(const std::unique_ptr<T>& ptr) : m_inner_ptr(ptr) {} // 仅提供安全的对象访问方式,不暴露裸指针 const T& operator*() const noexcept { return *m_inner_ptr; } const T* operator->() const noexcept { return m_inner_ptr.operator->(); } // 辅助查询方法:判断指针是否为空 bool is_null() const noexcept { return m_inner_ptr == nullptr; } };
用法示例
// 测试用类 class A { public: void do_something() const {} }; void SmartPointerUsage(ReadOnlyUniquePtr<A> ref) { // 合法操作:访问对象成员或引用 ref->do_something(); const A& obj = *ref; // 以下操作均触发编译错误,符合预期 // A* rawPtr = ref.get(); // 错误:类中未定义get()方法 // std::unique_ptr<A> moved = std::move(ref); // 错误:移动构造函数已被删除 // delete ref; // 错误:无法删除类类型对象 } int main() { std::unique_ptr<A> ptr = std::make_unique<A>(); SmartPointerUsage(ReadOnlyUniquePtr<A>(ptr)); return 0; }
需求验证
- 禁止调用.get():包装类未暴露
get()方法,任何尝试调用都会直接触发编译错误。 - 阻止std::move():类的移动构造/赋值函数已被显式删除,
std::move(ref)会触发编译错误。 - delete操作触发编译错误:尝试删除
ReadOnlyUniquePtr对象时,编译器会直接报错;由于包装类未提供裸指针获取接口,用户无法拿到可用于delete的原始指针(operator->返回的const T*若被强制delete属于恶意操作,但已从接口层面最大程度避免)。
内容的提问来源于stack exchange,提问作者Windings-Lab
相关产品推荐
相关产品推荐

