我有以下课程: // concreteIterator.h
template<class Item>
class concreteForwardItr : public iterator<Item>
{
public:
concreteForwardItr(){}
concreteForwardItr( List<Item> *theList){
// this->iterator();
targetList = theList;
currentPos = 0;
}
void first(){
currentPos = 0;
}
Item CurrentItem() const {
// return targetList->
if(!IsDone())
{
return targetList->get(currentPos);
}
private:
List<Item>* targetList;
//keep track of current position
long currentPos;
}
//iterator.h
template <class Item>
class iterator{
public:
virtual void first() =0;
virtual Item CurrentItem() = 0;
}
但编译器抱怨:未定义引用&#39; iterator :: iterator()&#39;
但我甚至不打电话给那个功能。我知道编译器会为列表类生成一个默认值。有谁看到问题是什么?
答案 0 :(得分:2)
首先,让我们按正确的顺序排列:
template <class Item>
class iterator{
public:
virtual void first() = 0;
virtual Item CurrentItem() = 0;
}
template<class Item>
class concreteForwardItr : public iterator<Item>
{
public:
concreteForwardItr(){}
concreteForwardItr( List<Item> *theList){
// this->iterator();
targetList = theList;
currentPos = 0;
}
void first(){
currentPos = 0;
}
Item CurrentItem() const {
// return targetList->
if(!IsDone()) // what is `IsDone`?
{
return targetList->get(currentPos);
}
// where's the closing brace?
private:
List<Item>* targetList;
//keep track of current position
long currentPos;
}
一个问题是concreteForwardItr::CurrentItem
没有覆盖iterator::CurrentItem
,因为前者是const
而后者不是override
。你应该总是使用&#34;关键字&#34; {1}当你想要覆盖虚函数时(如果你的编译器支持它):
Item CurrentItem() const override
{ /* ... */ }
这会产生错误的编译器错误:函数不会覆盖任何基类虚函数。
要使concreteForwardItr::CurrentItem
覆盖iterator::CurrentItem
,请调整其中任何一个的const限定。你应该调整哪一个是设计决策;如果接口声明该成员函数为const
,则实现不能改变它。
我在第一个代码块中评论了另外两个可能的问题。请注意,在源文件(.cpp)中,类模板iterator
应该出现在concreteForwardItr
之前(&#34;正确的顺序&#34;)。
您可能需要考虑重命名此类,因为它符合范围的C ++概念,而不是C ++ 迭代器的概念。
虚函数通常具有运行时开销,迭代器/范围通常用于循环。这可能是标准库(和增强范围IIRC)不为其自己的迭代器/范围类使用类层次结构设计的原因之一,而是无关的类实现了一些抽象概念,并结合了通用算法。算法也与迭代器的类设计分离,它们只需要这个概念。