我有一个Iterator类,并且我想在没有容器信息的情况下实现该类中的控件(这很奇怪,我知道但是我是在做家庭作业)。因此,我找到了一个技巧,可以将容器保留为成员变量。
这是我的标题模板Iterator类
template <class E, class C= vector<E> >
class Iterator {
public:
Iterator(C c);
Iterator();
bool hasNext()noexcept;
typename C::iterator& next()noexcept;
void remove()noexcept;
E& operator *()throw(domain_error);
private:
typename C::iterator itr;
C container;
};
这里是我的Iterator构造函数,用于初始化成员变量。
template<class E, class C>
Iterator<E, C>::Iterator(C c) {
container =c;
itr= c.begin();
}
这是我的问题函数Iterator<E,C>::hasNext
template<class E, class C>
bool
Iterator<E,C>::hasNext()noexcept {
return (itr != container.end()); //can not catch end element
}
由于Iterator::hasNext
函数无法捕获端点,因此hashSet::addAll
函数中发生无限循环。 (这是另一个使用Iterator类作为辅助类的类)
template<class E, class C>
void
HashSet<E, C>::addAll(C &c)noexcept {
Iterator<E,C> itr = Iterator<E,C>(c);
while(itr.hasNext()){
add(*itr);
itr.next();
}
}
hashSet :: add(E e)函数
template<class E, class C> void HashSet<E, C>::add(E e)noexcept { if(contains(e)!=true){ // cerr<<"hashSet::add "<< e <<endl; container.insert(container.end(),e); } }
答案 0 :(得分:1)
template<class E, class C> Iterator<E, C>::Iterator(C c)
和属性
C container;
:您使用C的副本
因此您必须将它们更改为具有属性template<class E, class C> Iterator<E, C>::Iterator(C & c)
的{{1}}
我来自Java,您必须保重,在Java中,对象是由地址给定的;在C ++中,没有修饰符'&',则对象是由值(复制的)给定的