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

How to write a getter for a container of shared_ptrs which does not allow modification of data

假设我有一个私有变量,它是 shared_ptr 到非 const 对象的向量。

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

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

我的理解是constshared_ptr<T>使指针本身const,而不是T。我尝试编译 shared_ptr<const T>,但如果 T 本身未在 class 中声明 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;
}

如果你想把你的 getter 到 return 共享指针向量指向 const 数据,只有一种方法,就是 return 复制指向 const 数据的共享指针。

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

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

最简单的方法是从内部向量的 beginend 迭代器构造一个向量。

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

请注意,将 const 添加到按值 return 的函数的 return 类型很少有用。

您还应该问问自己,复制所有这些内容是否值得 std::shared_ptr。您可能只想考虑 returning 一个 int.

的向量