gpt4 book ai didi

c++ - 如何正确封装 std::set ?

转载 作者:太空宇宙 更新时间:2023-11-04 14:46:32 24 4
gpt4 key购买 nike

我有一个名为 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 使集合成为“只读”的迭代器,例如

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com