gpt4 book ai didi

c++ - 关于模板继承

转载 作者:行者123 更新时间:2023-11-30 04:06:36 25 4
gpt4 key购买 nike

我有以下类(class)://具体迭代器.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;
}

但编译器提示:未定义对“iterator::iterator()”的引用

但我什至没有调用那个函数。我知道编译器会为列表类生成一个默认的。有人知道问题出在哪里吗?

最佳答案

首先,让我们按正确的顺序排列:

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(如果你的编译器支持它):

Item CurrentItem() const override
{ /* ... */ }

这会产生类似错误:函数不覆盖任何基类虚函数的编译器错误。

要使 concreteForwardItr::CurrentItem 覆盖 iterator::CurrentItem 调整其中任何一个的常量限定。您应该调整哪一个是设计决定;如果接口(interface)将该成员函数声明为 const,则实现无法更改它。

我在第一个代码块中评论了另外两个可能的问题。请注意,在源文件 (.cpp) 中,类模板 iterator 应该出现在 concreteForwardItr 之前(“正确的顺序”)。


您可能需要考虑重命名此类,因为它符合 范围 的 C++ 概念,而不是 C++ 迭代器 的概念。

虚函数通常有运行时开销,循环中经常使用迭代器/范围。这可能是标准库(和提升范围 IIRC)不为自己的迭代器/范围类使用类层次结构设计,而是使用不相关的类来实现一些抽象概念并结合通用算法的原因之一。算法也与迭代器的类设计解耦,它们只需要概念。

关于c++ - 关于模板继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22844402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com