我有一个名为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/

10-12 22:14