如何将一组指针转换为一组const指针?

时间:2016-03-16 23:13:17

标签: c++ pointers casting const containers

我有一个班级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();
};

我希望使用dataSetManager班获取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

有更好的方法吗?

2 个答案:

答案 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>具有相同的结构。