2016-03-16 88 views
2

我有一个类Data如何将一组指针转换为一组const指针?

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()摆脱ManagerdataSet,但我不希望他人修改设置或数据。所以我想返回类型GetDataSet()是一个const指针的const指针。然而,我不能直接return &dataSetGetDataSet(),因为std::set<std::shared_ptr<Data>>不能转换为std::set<std::shared_ptr<const Data>>

解决该问题的一种方法是制作该套件的副本。但它有额外的成本。另一种方法是使Data类的Set()函数保密,并让Manager类成为类Data的朋友。但它会将类Data的所有私有字段暴露给Manager类。

有没有更好的方法?

+0

有没有简单的方法来做到这一点。部分原因与std :: shared_ptr的某些设计缺陷有关。 –

+0

是否有你需要使用共享指针开始的原因?如果你只是使用std :: set 那么你可以提供对该集合的const引用的公共访问。在附注中,看到使用共享指针同时提供返回原始指针的公共方法也很奇怪。 – qexyn

+0

@qexyn我的'Data'类实际上很大。在'Manager'类中有两个数据集由几乎相同的一组数据组成,而一个数据集按属性'a'排序,另一个按'b'排序。有时我会从一组中获得前几个元素,并将它们从另一个中移除。所以我选择使用指针。 – Haoshu

回答

-1

我不确定,但也许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; 
    } 
}; 

编辑 我刚刚试了一下在Visual Studio 10个Express和它的工作。

我猜这只是因为std::shared_ptr<Data>std::shared_ptr<const Data>具有相同的结构。

+0

It也适用于我。我试过'return&((const std :: set >)dataSet);'但是没有尝试'返回(const std :: set > *)&dataSet;'。我认为它也应该按预期工作。但是因为有人减去这个答案,我想知道它有什么不足吗? – Haoshu

+0

我猜down选民生气,因为我没有使用'return reinterpret_cast (&dataSet);'这也适用... :) – SHR

0

我认为一个很好的解决方案是构造并返回一个 std::vector<const Data*>,因为你不想与调用者共享所有权(我假设)。除非经常使用GetDataSet(),否则我认为它不应该影响性能太多。

相关问题