【发布时间】:2016-07-03 02:30:12
【问题描述】:
我有一堂课Data:
class Data {
private:
int d;
public:
int Get() const {
return d;
}
void Set(int d) {
this->d = d;
}
};
还有一个类Manager来管理一组Data:
class Manager {
private:
std::set<std::shared_ptr<Data>> dataSet;
public:
const std::set<std::shared_ptr<const Data>>* GetDataSet();
};
我想使用GetDataSet() 从Manager 类中获取dataSet,但我不希望其他人修改集合或数据。所以我希望 GetDataSet() 的返回类型是指向一组 const 指针的 const 指针。但是,我不能在GetDataSet() 中直接return &dataSet,因为std::set<std::shared_ptr<Data>> 无法转换为std::set<std::shared_ptr<const Data>>。
解决问题的一种方法是复制该集合。但它有额外的费用。另一种方法是将Data类的Set()函数设为私有,让Manager类成为Data类的朋友。但它会将Data 类的所有私有字段暴露给Manager 类。
有没有更好的办法?
【问题讨论】:
-
没有简单的方法可以做到这一点。部分原因与 std::shared_ptr 的某些设计缺陷有关。
-
您是否有理由首先需要使用共享指针?如果您只使用 std::set 那么您可以提供对集合的 const 引用的公共访问。顺便说一句,看到共享指针的使用同时提供返回原始指针的公共方法也很奇怪。
-
@qexyn 我的
Data班级实际上很大。我在Manager类中有两个数据集,包含几乎相同的数据集,而一组按属性a排序,另一个按b排序。有时我会从一组中获取前几个元素,然后从另一组中删除它们。所以我选择使用指针。 -
@qexyn 如果我将我的数据集设置为智能指针
std::shared_ptr<std::set<std::shared_ptr<Data>>> dataSet;,并返回一个智能指针,它仍然无法转换。std::shared_ptr<const std::set<std::shared_ptr<const Data>>> GetDataSet() {return std::shared_ptr<const std::set<std::shared_ptr<const Data>>>(dataSet);}
标签: c++ pointers casting constants containers