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()
从class
Manager
获取
dataSet
,但我不希望其他人修改集合或数据。因此,我希望返回类型
GetDataSet()
是指向一组常量指针的常量指针。但是,我不能在
GetDataSet()
中直接
返回&dataSet
,因为
std::set
不能转换为
std::set

解决这个问题的一个方法是复制一个集合。但它有额外的成本。另一种方法是将class
Data
Set()
函数设置为私有,并让class
Manager
成为class
Data
的朋友。但它将向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 My
Data
类实际上很大。我在
Manager
类中有两个数据集,它们由几乎相同的数据集组成,其中一个数据集按属性
a
排序,另一个按属性
b
排序。有时我从一个集合中获取前几个元素,然后从另一个集合中删除它们。所以我选择使用指针。@qexyn,如果我将数据集设置为智能指针
std::shared\u ptr数据集,并返回智能指针,但仍无法转换
std::shared_ptr GetDataSet(){return std::shared_ptr(dataSet);}
实现这一点并不容易。部分原因与std::shared_ptr的某些设计缺陷有关。是否有理由首先使用共享指针?如果您只使用std::set,那么您可以提供对该集合的const引用的公共访问。另一方面,在同时提供一个返回原始指针的公共方法时使用共享指针也很奇怪。@qexyn My
Data
类实际上很大。我在
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)它也可以工作…:)