得秒的定律或返回整个向量

Igo*_*Oks 4 c++ oop vector law-of-demeter

哪一个更好:

public:
  const vector<int> & GetPointsVector();
private:
  vector<int> PointsVector;
Run Code Online (Sandbox Code Playgroud)

要么:

public:
  int GetCurrentPoint();
  void MoveToFirstPoint();
  void MoveToNextPoint();
  bool IsAtLastPoint();
  size_t GetNumberOfPoints();
private:
  vector<int> PointsVector;
Run Code Online (Sandbox Code Playgroud)

ami*_*mit 13

两者都不是.最好返回begin()和end()迭代器,或者更好地返回迭代器的boost :: range.

private:
        typedef std::vector<int>            PointsContainer;
public: 
        typedef boost::iterator_range<PointsContainer::const_iterator> PointsRange;
        PointsRange getPointsRange() const {
            return boost::make_iterator_range(pointsContainer_.begin(), pointsContainer_.end()); 
        }
Run Code Online (Sandbox Code Playgroud)

优点是遍历逻辑隐藏在范围/迭代器中

在使用时,一种替代方法是:

int p;
foreach(p, obj.getPointsRange()) {
   //...
}
Run Code Online (Sandbox Code Playgroud)

除此以外

C::PointsRange r = obj.getPointsRange();
for(C::PointsRange::iterator i = r.begin(); i != r.end(); ++i) {
      int p = *i;
      //...
}
Run Code Online (Sandbox Code Playgroud)