我有一个名为Particle的类,该类具有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()
函数吗?提前致谢。
编辑:我发布的代码只是类结构的示例。 “真实”类包含更多的集合和其他数据,这些数据对这个问题并不重要(我假设)。
最佳答案
我不确定您为什么不想公开集合本身,但是如果是这样,是因为您要确保集合的内容不能在class Particle
之外更改,只需返回const
迭代器即可使集合“读取” -only”,例如
typedef std::set<vtkIdType>::const_iterator CellIterator;
CellIterator beginCell() const { return this->cells.begin(); }
CellIterator endCell() const { return this->cells.end(); }
关于c++ - 如何正确封装std::set?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1834230/