c++ - 如何从 C++ 中的函数正确返回不可修改的对象引用?
问题描述
我正在尝试从函数返回一个 const 对象,以便我可以从中获取信息,但是一旦创建它就不能更改任何内容。我有以下代码
Sprite const& GetSprite() const {
return *m_sprite;
}
std::unique_ptr<Sprite> m_sprite;
int test = 5;
我在代码中的其他地方调用了这个GetSprite
函数
Sprite sprite = entity->GetSprite();
sprite.test = 6;
这似乎编译得很好,并且在单步执行后test
实际上更改了值。我会假设从返回的对象GetSprite
不允许我修改对象,但是 const 限定符似乎被删除了?
我做错了还是有不同的方法来实现这一点?
解决方案
Sprite sprite = entity->GetSprite();
这将创建Sprite
对象GetSprite
返回的副本,使用 `Sprite.
编辑副本不应导致修改原始内容,除非您Sprite
写错了,或者您对引用、值和指针语义感到困惑。
Sprite const& sprite = entity->GetSprite();
这获得了对包含的引用Sprite
,您不能通过它修改它。
如果你想阻止复制Sprite
s,你可以这样做:
Sprite(Sprite const&) = delete;
但我建议允许移动Sprite
s:
Sprite(Sprite&&) = default;
尤其是c++17之前(当保证省略使其不那么重要时)。
推荐阅读
- amazon-ec2 - 将 AWS Spot 实例用于构建代理?
- excel - 返回一行的最后一个值 - EXCEL
- python - 如何修改 xml 文件中子项的内部文本?
- flutter - 如何解决 Flutter 导航 BuilderContext 子类型错误?
- oracle-cloud-infrastructure - OCI-Ansible 模块 --check Dry 选项在身份验证时失败
- firebase - 使用 Flutter 更新图像时更新 Cloud Firestore 中对图像 url 的所有引用
- html - 如何在我的网站上找到使图像变暗的 css 代码?
- automapper-9 - 将 AutoMapper 从 v6 升级到 v9 并使用分辨率上下文进行单元测试
- php - html, php:需要建议如何简化工作的 html 代码
- angular - Nativescript 和 Stripe 集成:Podfile 中对 Stripe 的依赖重复