【问题标题】:How do I correctly return an unmodifiable object reference from function in C++?如何从 C++ 中的函数正确返回不可修改的对象引用?
【发布时间】:2019-05-13 22:01:55
【问题描述】:

我正在尝试从函数返回一个 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 &amp; sprite = entity-&gt;GetSprite();
  • Sprite sprite = entity-&gt;GetSprite(); 创建一个可修改的副本
  • 这可能是你想要的:const Sprite&amp; sprite = ...
  • 很难防止意外复制,除非明确删除复制构造函数和赋值运算符。 Sprite (const Sprite &amp;) = delete;Sprite &amp; operator=(const Sprite &amp;) = delete; 当然,这使得有意复制变得更加困难。
  • @jjmcc 由于您没有修改您说不应该修改的对象,因此不清楚您为什么要阻止它。你能更准确地了解你想要避免的事情吗?是复制的成本吗?

标签: c++ constants pass-by-reference


【解决方案1】:
Sprite sprite = entity->GetSprite();

这将使用`Sprite 的复制构造函数创建Sprite 对象GetSprite 返回的副本。

编辑副本不应导致修改原始内容,除非你写错了Sprite,或者你对引用、值和指针语义感到困惑。

Sprite const& sprite = entity->GetSprite();

这将获得对包含的Sprite 的引用,您无法通过该引用对其进行修改。

如果你想阻止Sprites的复制,你可以这样做:

Sprite(Sprite const&) = delete;

但我建议允许移动 Sprites:

Sprite(Sprite&&) = default;

尤其是 之前的版本(当保证省略使其不那么重要时)。

【讨论】:

    猜你喜欢
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多