gpt4 book ai didi

c++ - 无需复制的大型成员变量的 getter

转载 作者:行者123 更新时间:2023-12-01 14:42:57 25 4
gpt4 key购买 nike

我有一个包含大型成员变量的类。就我而言,大成员变量是许多对象的容器,它必须是私有(private)的,因为我不想让用户直接修改它

class Example {
public:
std::vector<BigObject> get_very_big_object() const { return very_big_object; }
private:
std::vector<BigObject> very_big_object;
}

我希望用户能够在不制作拷贝的情况下查看对象:
Example e();
auto very_big_object = e.get_very_big_object(); // Uh oh, made a copy
cout << very_big_object[11]; // Look at any element in the vector etc

我对最好的方法有点困惑。我考虑过返回一个常量引用,即,做我的 setter/getter :
const std::vector<BigObject>& get_very_big_object() const { return very_big_object; }

我读了 this article这表明它可能存在风险,并且智能指针 std::unique_ptr可能会更好,但是使用现代 C++11 移动语义可以最好地解决这个问题。但我发现这有点神秘。

这样做的现代最佳实践是什么?

最佳答案

I read this article that suggests it could be risky and that that a smart pointer std::unique_ptr could be better, but that this problem can be best solved using modern C++11 move semantics.



在这一点上,这篇文章是完全错误的。智能指针不会消除“风险”。

文章相关部分快速总结
  • 如果一个类返回 const引用数据成员,客户端代码可能会引入 const_cast从而在不通过类的 API 的情况下更改数据成员。
  • 文章建议(错误地)使用智能指针可以避免上述情况。设置是为了让类维护一个指向数据的共享指针,并让 getter 将该指针转换为指向 const 的共享指针。数据。

  • 批点

    首先,这是行不通的。只需取消引用智能指针即可获得 const引用数据,然后可以是 const_cast像之前一样。使用作者自己的例子,而不是
    std::string &evil = const_cast<std::string&>(obj.someStr());

    采用
    std::string &evil = const_cast<std::string&>(*obj.str_ptr());

    返回智能指针时获得相同的数据更改结果。整篇文章没有错,但确实有几点错了。这是其中之一。

    其次,这不是您关心的问题。当您返回 const引用,你告诉客户代码这个值是不会改变的。如果客户端代码仍然这样做,那么是客户端代码破坏了协议(protocol)。本质上,客户端代码调用了未定义的行为,因此您的类可以自由地做任何事情,甚至使程序崩溃。

    What's the modern best practice for doing this?



    只需返回 const引用。 (大多数规则都有异常(exception),但根据我的经验,这条规则似乎在 95-99.9% 的时间都在目标上。)

    关于c++ - 无需复制的大型成员变量的 getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61535200/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com