c++ - 我是否暴露了太多的迭代器?

标签 c++ iterator

我的类(class)可以有 child ,所以我需要公开迭代器。渲染类需要反向迭代它们,这就是我有反向迭代器的原因。但是有没有办法减少这些,因为看起来很多:

std::vector<AguiWidget*>::iterator          getChildBeginIterator();
std::vector<AguiWidget*>::reverse_iterator  getChildRBeginIterator();
std::vector<AguiWidget*>::iterator          getChildEndIterator();
std::vector<AguiWidget*>::reverse_iterator  getChildREndIterator();

std::vector<AguiWidget*>::const_iterator            getChildBeginIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getChildRBeginIterator() const;
std::vector<AguiWidget*>::const_iterator            getChildEndIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getChildREndIterator() const;

std::vector<AguiWidget*>::iterator          getPrivateChildBeginIterator();
std::vector<AguiWidget*>::reverse_iterator  getPrivateChildRBeginIterator();
std::vector<AguiWidget*>::iterator          getPrivateChildEndIterator();
std::vector<AguiWidget*>::reverse_iterator  getPrivateChildREndIterator();

std::vector<AguiWidget*>::const_iterator            getPrivateChildBeginIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getPrvateChildRBeginIterator() const;
std::vector<AguiWidget*>::const_iterator            getPrivateChildEndIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getPrivateChildREndIterator() const;

谢谢

最佳答案

那些对我来说看起来不错。或者,如果不知道您到底在做什么,我就无法更准确地发表评论。但是你可以肯定做一件事:你为什么不使用typedef?如果你使用 typedef,你也可以在类之外使用它,也就是在客户端代码中,你会使用类!

例如,

class sample
{
public:

  //make these typedef public so you use it from outside!
  typedef std::vector<AguiWidget*>::iterator  iterator ;
  typedef std::vector<AguiWidget*>::reverse_iterator reverse_iterator;
  typedef std::vector<AguiWidget*>::const_iterator const_iterator;
  typedef std::vector<AguiWidget*>::const_reverse_iterator const_reverse_iterator;

  iterator           child_begin();
  reverse_iterator   child_rbegin();
  iterator           child_end();
  reverse_iterator   child_rend();

  const_iterator            child_begin() const;
  const_reverse_iterator    child_rbegin() const;
  const_iterator            child_end() const;
  const_reverse_iterator    child_rend() const;
};

//Usage
sample s;
sample::iterator it= s.child_begin(); 
//see this ^^^^^^^^ how we use the typedef here!

这看起来更好! typedef 基本上封装了实现,因为它可以帮助你隐藏类的实现细节;例如,您在类中使用什么容器,std::vectorstd::list 还是什么?再次查看上面的用法说明;光看就不能说是容器类型吧?

还请注意,我也更改了函数名称。我认为这很好。毕竟,STL 只使用 beginend 而不是 beginIteratorendIterator。但是,小写是我的口味,您可能仍然更喜欢大写以保持一致性!

在我看来,const 函数没有多大意义,如果你想公开只读迭代器,你可能会喜欢下面的一组函数!

const_iterator            readonly_child_begin();
const_reverse_iterator    readonly_child_rbegin();
const_iterator            readonly_child_end();
const_reverse_iterator    readonly_child_rend();


//Usage
sample s;
sample::const_iterator cit= s.readonly_child_begin(); 
//see this ^^^^^^^^ how we use the typedef here!

关于c++ - 我是否暴露了太多的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273716/

相关文章:

c++ pthreads - 在尝试锁定互斥锁以进行读取时崩溃

c++ - 线程与进程

c++ - 为什么 clang 在类似问题上进行不同的诊断?

java - 解决方案: Iterator which doesn't know if it has a next element

c++ - vector 结束迭代器

C++ EOF Getline 错误

c++ - 我该如何解决这个 C++ 访问冲突问题?

Java Hashmap Iterator 条件问题

java - 如何从 ListIterator 中删除所有元素然后添加新元素

c++ - 如何从迭代器获取迭代器底层类型?