: CSharpCollection &outer; //外部类 int index = 0; //下标 Enumerator (CSharpCollection &o) : outer(o){ } bool MoveNext() override { index++; if (index <= 10) return true; delete this; return false; } void Reset() override { index = 0; } std::string &Current() override { return outer.str[index]; } ~Enumerator (){ std::cout << "Enumerator 被析构" << std::endl; } }; public: std::string str[10] {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"}; IEnumerator
& GetEnumerator() override{ return *new Enumerator(*this); } };
需要注意的是,凡是体现多态性的函数,返回值必须为引用或者指针,且不得为栈中的临时变量,因此我们调用完GetEnumerator()后,要将生成的迭代器删除,删除的代码写在了MoveNext()内,当游标不可移动的时候,迭代器被删除。
以后就可以用自己的foreach宏定义来遍历元素了:
std::string a;
CSharpCollection csc;
IEnumerable
& refcsc = csc;
foreach (a , refcsc ){
std::cout << a << std::endl;
}
上面代码的第三行意在说明,如果一个类中继承了IEnumerable类,它一定是可迭代的,可以调用它的Reset()、MoveNext()、Current(),也可以用我们刚刚写的foreach来进行遍历。
|