【发布时间】:2017-05-11 06:37:31
【问题描述】:
#include <iostream>
using namespace std;
template <typename T> class Iterator
{
T * ptr;
public:
Iterator(T * addr)
{
ptr=NULL;
ptr=addr;
}
//not working
//virtual Iterator * operator ++(int x);
/*Iterator * operator ++(int x)
{
(this->ptr)++;
return this;
}*/
T operator *()
{
return *ptr;
}
};
template<typename T>
class Vector{
T * a;
public:
Vector(size_t n)
{
a=new T[5];
}
T& operator [](int x)
{
return a[x];
}
class iterator: public Iterator<T>
{
public:
iterator(T * addr): Iterator<T>(addr)
{}
/* not working
Iterator<T> * operator ++(int x)
{
Iterator<T>::ptr++;
return this;
}*/
//working now
iterator * operator ++(int x)
{
Iterator<T>::ptr++;
return this;
}
};
iterator begin()
{
iterator ob(&a[0]);
return ob;
}
};
int main()
{
Vector <char> v(5);
for(int i=0;i<5;i++)
v[i]=i+65;
for(int i=0;i<5;i++)
cout<<v[i]<<endl;
/*~~~~~~ What I want~~~~~~
Iterator <char> p=v.begin();
*/
// what is working now:
Vector<char>:: iterator p=v.begin();
while(*p){
cout<<*p<<endl;
p++;
}
return 0;
}
在上面的代码中,我想在 Iterator 类中使操作符 ++() 成为虚拟的,以便在 main 中我可以使用:
Iterator <char> ptr=v.begin();
而不必使用:
Vector <char>:: iterator p=v.begin();
这是一个具有运行时多态性的单个基类引用,用于根据值是向量还是列表来确定调用哪个 ++ 运算符。但是,当我在 Iterator 类中将其声明为虚拟时,它不起作用。我必须专门为内部类声明它,但我想要一个单一的接口,就像在 Java 中一样。我正在尝试在 C++ 中实现 Java 集合层次结构以获得更好的结构。出了什么问题? 发生这种情况是因为 Iterator 是一个模板类,它使返回类型 Iterator 也是模板,也就是说,运算符 ++() 函数是一个模板函数?我知道模板函数不能是虚拟的,只有具体的函数可以是虚拟的。有什么办法可以解决这个问题?
【问题讨论】:
-
为什么要在迭代器上实现运行时多态性?实际用途是什么?
-
在 Java 中,我们只有一个 Iterator 接口,但在 C++ 中,我们使用 vector
:: 迭代器和另一个用于列表的迭代器,依此类推。所以我想做的是制作一个 Iterator 基类。然后使用基类引用来调用不同的迭代器实现,例如,list 与vector 有不同的实现。所以在运行时它会根据“迭代器”引用指向的对象来确定调用谁的迭代器实现。 -
你没有回答我。我已经知道你想要运行时多态性。我问的是为什么。就像实际用例一样。我想知道您的用例有多特别,因为我们每天都在使用的基于概念的编译时多态性已经涵盖了大多数情况。