gpt4 book ai didi

c++ - 如何为不允许修改数据的 shared_ptrs 容器编写 getter

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:43 25 4
gpt4 key购买 nike

假设我有一个私有(private)变量,它是 shared_ptr 的 vector s 到非 const对象。

是否可以编写一个只允许对共享指针指向的数据进行读取访问的 getter 方法?

为了优雅,我希望能够使用基于范围的循环,所以我想避免写成 const_iterators .

我的理解是 const shared_ptr<T>使指针本身 const , 不是 T .我试着编译 shared_ptr<const T> , 但如果 T 则无法编译本身未声明 const在类里。

换句话说,我怎么能这样写:

#include <iostream>
#include <vector>
#include <memory>

using std::vector;
using std::shared_ptr;
using std::make_shared;
using std::cout;
using std::endl;

class MyClass{

public:
MyClass(int element1, int element2)
{
myVector_.push_back(std::make_shared<int>(element1));
myVector_.push_back(std::make_shared<int>(element2));
}

// I want something like this, but doesn't compile
// const vector<shared_ptr<const int>> readMyVector() const {return myVector_;}

const vector<shared_ptr<int>> readMyVector() const {return myVector_;}

private:

// Should NOT be <const int>, the class should be able to modify its elements
vector<shared_ptr<int>> myVector_;
};

int main(){
auto testobject = MyClass(1,2);
for (auto my_protected_data : testobject.readMyVector()){
cout<<(*my_protected_data)<<endl;
(*my_protected_data) = 25;
cout<<(*my_protected_data)<<endl; // Should not happen
}
return 0;
}

最佳答案

要返回的正确类型是 std::vector<std::shared_ptr<const int>> ,但您必须手动制作该 vector 。 std::shared_ptr<T>可转换为 std::shared_ptr<const T> ,但问题是 std::vector<T>不能隐式转换为 std::vector<U>仅仅因为 T可转换为 U .

最简单的方法是从内部 vector 的 begin 构造一个 vector 和 end迭代器。

vector<shared_ptr<const int>> readMyVector() const 
{
return{ myVector_.begin(), myVector_.end() };
}

注意添加const按值返回的函数的返回类型很少有用。

您还应该问问自己,复制所有这些 std::shared_ptr 是值得的吗? .您可能想考虑简单地返回 int 的 vector .

关于c++ - 如何为不允许修改数据的 shared_ptrs 容器编写 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44415518/

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