我有一个名为Particle的类,它有一个std :: set作为成员。这个类看起来是这样的:如何正确封装std :: set?
class Particle {
private:
std::set<vtkIdType> cells;
std::set<vtkIdType>::iterator ipc;
public:
Particle() {};
enum state {EXISTS = -1, SUCCESS = 0, ERROR = 1};
state addCell(const vtkIdType cell);
int numCells() { return static_cast<int>(cells.size()); }
vtkIdType getFirstCell() { return (*(ipc = this->cells.begin()));}
vtkIdType getNextCell() { return *(++ipc); }
vtkIdType hasNextCell() { ++ipc; if (ipc == this->cells.end()) return false; --ipc; return true; }
std::string getOutput();
};
我很不满getFirstCell()
,getNextCell()
尤其是hasNextCell()
,他们的存在是因为我不想暴露自己设定。我不得不使用通过++ipc
和--ipc
的方式,因为if((ipc+1) == this->cells.end())
给出了一个编译器错误,ipc + 1似乎是问题所在。
什么是封装一个集合并访问它的好方法?另外,有没有一种很好的方法来摆脱getFirstCell()
函数?
在此先感谢。
编辑:我发布的代码只是类结构的一个例子。 “真实”类包含更多的集合和其他数据,这对于这个问题并不重要(我认为)。
您可以将'hasNextCell'实现为'iterator i = ipc; return ++ i!= cells.end();'以避免在查询期间改变状态。就个人而言,我会与詹姆斯的回答一起,并展示“开始”和“结束”。 – 2009-12-02 18:04:19