我有一个班级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();
};
我希望使用dataSet
从Manager
班获取GetDataSet()
,但我不希望其他人修改集合或数据。所以我希望返回类型GetDataSet()
是一个指向一组const指针的const指针。但是,我无法直接在return &dataSet
GetDataSet()
std::set<std::shared_ptr<Data>>
,因为std::set<std::shared_ptr<const Data>>
无法转换为Set()
。
解决问题的一种方法是制作该集的副本。但它有额外的成本。另一种方法是将类Data
的{{1}}函数设为私有,让类Manager
成为类Data
的朋友。但它会将类Data
的所有私有字段暴露给类Manager
。
有更好的方法吗?
答案 0 :(得分:0)
我认为一个很好的解决方案是构建并返回一个
std::vector<const Data*>
,因为您不想与调用者共享所有权(我假设)。除非经常使用GetDataSet()
,否则我认为它不会对性能产生太大影响。
答案 1 :(得分:-1)
我不确定但是C指针转换可能会有所帮助,当你使用typedef时它会更容易。
像这样:typedef std::set<std::shared_ptr<Data>> DataSet;
typedef const std::set<std::shared_ptr<const Data>> ConstDataSet;
class Manager {
private:
DataSet dataSet;
public:
ConstDataSet* GetDataSet(){
return (ConstDataSet*) &dataSet;
}
};
修改强> 我刚刚在visual studio 10 Express中试过它并且它有效。
我认为这只是因为std::shared_ptr<Data>
和std::shared_ptr<const Data>
具有相同的结构。