如何为 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
.
最简单的方法是从内部向量的 begin
和 end
迭代器构造一个向量。
vector<shared_ptr<const int>> readMyVector() const
{
return{ myVector_.begin(), myVector_.end() };
}
请注意,将 const
添加到按值 return 的函数的 return 类型很少有用。
您还应该问问自己,复制所有这些内容是否值得 std::shared_ptr
。您可能只想考虑 returning 一个 int
.
的向量
假设我有一个私有变量,它是 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
.
最简单的方法是从内部向量的 begin
和 end
迭代器构造一个向量。
vector<shared_ptr<const int>> readMyVector() const
{
return{ myVector_.begin(), myVector_.end() };
}
请注意,将 const
添加到按值 return 的函数的 return 类型很少有用。
您还应该问问自己,复制所有这些内容是否值得 std::shared_ptr
。您可能只想考虑 returning 一个 int
.