You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何返回指向不可修改底层对象的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:00:58