C++ 如何将一组指针转换为一组常量指针?
我有一个类C++ 如何将一组指针转换为一组常量指针?,c++,pointers,casting,constants,containers,C++,Pointers,Casting,Constants,Containers,我有一个类数据: class Data { private: int d; public: int Get() const { return d; } void Set(int d) { this->d = d; } }; class Manager { private: std::set<std::shared_ptr<Data>> dataSet; public: cons
数据:
class Data {
private:
int d;
public:
int Get() const {
return d;
}
void Set(int d) {
this->d = d;
}
};
class Manager {
private:
std::set<std::shared_ptr<Data>> dataSet;
public:
const std::set<std::shared_ptr<const Data>>* GetDataSet();
};
以及一个类管理器
,用于管理一组数据
:
class Data {
private:
int d;
public:
int Get() const {
return d;
}
void Set(int d) {
this->d = d;
}
};
class Manager {
private:
std::set<std::shared_ptr<Data>> dataSet;
public:
const std::set<std::shared_ptr<const Data>>* GetDataSet();
};
类管理器{
私人:
std::set数据集;
公众:
常量std::set*GetDataSet();
};
我想使用GetDataSet()
从classManager
获取dataSet
,但我不希望其他人修改集合或数据。因此,我希望返回类型GetDataSet()
是指向一组常量指针的常量指针。但是,我不能在GetDataSet()
中直接返回&dataSet
,因为std::set
不能转换为std::set
解决这个问题的一个方法是复制一个集合。但它有额外的成本。另一种方法是将classData
的Set()
函数设置为私有,并让classManager
成为classData
的朋友。但它将向class管理器
公开class数据的所有私有字段
有更好的方法吗?我不确定,但也许C指针转换会有所帮助,使用typedefs会更容易
像这样:
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;
}
};
typedef std::set数据集;
typedef const std::set ConstDataSet;
班级经理{
私人:
数据集;
公众:
ConstDataSet*GetDataSet(){
返回(ConstDataSet*)&数据集;
}
};
编辑
我刚刚在VisualStudio10Express中试用过,效果很好
我想它之所以能工作是因为std::shared_ptr
和std::shared_ptr
具有相同的结构 我不确定,但也许C指针转换会有所帮助,使用typedefs会更容易
像这样:
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;
}
};
typedef std::set数据集;
typedef const std::set ConstDataSet;
班级经理{
私人:
数据集;
公众:
ConstDataSet*GetDataSet(){
返回(ConstDataSet*)&数据集;
}
};
编辑
我刚刚在VisualStudio10Express中试用过,效果很好
我想它之所以能工作是因为std::shared_ptr
和std::shared_ptr
具有相同的结构 我认为一个很好的解决方案是构造并返回
std::vector
,因为您不想与调用方共享所有权(我假定)。除非经常使用GetDataSet()
,否则我认为它不会对性能产生太大影响。我认为一个很好的解决方案是构造并返回一个
std::vector
,因为您不想与调用方共享所有权(我假定)。除非经常使用GetDataSet()
,否则我认为它不会对性能产生太大影响。要做到这一点并不容易。部分原因与std::shared_ptr的某些设计缺陷有关。是否有理由首先使用共享指针?如果您只使用std::set,那么您可以提供对该集合的const引用的公共访问。另一方面,在同时提供一个返回原始指针的公共方法时使用共享指针也很奇怪。@qexyn MyData
类实际上很大。我在Manager
类中有两个数据集,它们由几乎相同的数据集组成,其中一个数据集按属性a
排序,另一个按属性b
排序。有时我从一个集合中获取前几个元素,然后从另一个集合中删除它们。所以我选择使用指针。@qexyn,如果我将数据集设置为智能指针std::shared\u ptr数据集代码>,并返回智能指针,但仍无法转换std::shared_ptr GetDataSet(){return std::shared_ptr(dataSet);}
实现这一点并不容易。部分原因与std::shared_ptr的某些设计缺陷有关。是否有理由首先使用共享指针?如果您只使用std::set,那么您可以提供对该集合的const引用的公共访问。另一方面,在同时提供一个返回原始指针的公共方法时使用共享指针也很奇怪。@qexyn MyData
类实际上很大。我在Manager
类中有两个数据集,它们由几乎相同的数据集组成,其中一个数据集按属性a
排序,另一个按属性b
排序。有时我从一个集合中获取前几个元素,然后从另一个集合中删除它们。所以我选择使用指针。@qexyn,如果我将数据集设置为智能指针std::shared\u ptr数据集代码>,并返回智能指针,但仍无法转换std::shared_ptr GetDataSet(){return std::shared_ptr(dataSet);}
它也适用于我。我尝试了返回((const std::set)数据集)代码>但未尝试返回(const std::set*)&dataSet代码>。我认为它也应该像预期的那样工作。但是,既然有人减去了这个答案,我想知道它有什么不足之处吗?我猜那些被否决的选民会生气,因为我没有使用return reinterpret\u cast(&dataSet)代码>它也可以工作…:)这对我也很管用。我尝试了返回((const std::set)数据集)代码>但未尝试返回(const std::set*)&dataSet代码>。我认为它也应该像预期的那样工作。但是,既然有人减去了这个答案,我想知道它有什么不足之处吗?我猜那些被否决的选民会生气,因为我没有使用return reinterpret\u cast(&dataSet)代码>它也可以工作…:)