c++ - C++ 双向链表迭代器
问题描述
我在这里想念什么?以下是我与我的代码相处的错误:
错误:
Iterator.cpp:4:11: error: 'Iterator' in 'class NodeList' does not name a type
NodeList::Iterator::Iterator(Node* u) // constructor from Node*
^
Iterator.cpp:7:19: error: 'NodeList::Iterator' has not been declared
Elem& NodeList::Iterator::operator*() // reference to the element
^
Iterator.cpp:7:39: error: 'Elem& operator*()' must have an argument of class or enumerated type
Elem& NodeList::Iterator::operator*() // reference to the element
^
Iterator.cpp:10:18: error: 'NodeList::Iterator' has not been declared
bool NodeList::Iterator::operator==(const Iterator& p) const
^
Iterator.cpp:10:58: error: non-member function 'bool operator==(const Iterator&)' cannot have cv-qualifier
bool NodeList::Iterator::operator==(const Iterator& p) const
^
Iterator.cpp:10:58: error: 'bool operator==(const Iterator&)' must take exactly two arguments
Iterator.cpp:13:18: error: 'NodeList::Iterator' has not been declared
bool NodeList::Iterator::operator!=(const Iterator& p) const
^
Iterator.cpp:13:58: error: non-member function 'bool operator!=(const Iterator&)' cannot have cv-qualifier
bool NodeList::Iterator::operator!=(const Iterator& p) const
^
Iterator.cpp:13:58: error: 'bool operator!=(const Iterator&)' must take exactly two arguments
Iterator.cpp:16:13: error: 'Iterator' in 'class NodeList' does not name a type
NodeList::Iterator& NodeList::Iterator::operator++()
^
Iterator.cpp:19:13: error: 'Iterator' in 'class NodeList' does not name a type
NodeList::Iterator& NodeList::Iterator::operator--()
^
编码:
#ifndef NODE_H
#define NODE_H
#include <string>
using namespace std;
typedef string Elem;
struct Node
{ // a node of the list
Elem elem; // element value
Node* prev; // previous in list
Node* next; // next in list
};
#endif /* NODE_H */
#ifndef ITERATOR_H
#define ITERATOR_H
#include "Node.h"
class Iterator
{ // an iterator for the list
private:
Node* v; // pointer to the node
Iterator(Node* u); // create from node
public:
Elem& operator*(); // reference to the element
bool operator==(const Iterator& p) const; // compare positions
bool operator!=(const Iterator& p) const;
Iterator& operator++(); // move to next position
Iterator& operator--(); // move to previous
friend class NodeList; // give NodeList access
};
#endif /* ITERATOR_H */
#ifndef NODELIST_H
#define NODELIST_H
#include "Node.h"
#include "Iterator.h"
typedef int Elem; // list base element type
class NodeList
{ // node-based list
public:
NodeList(); // default constructor
int size() const; // list size
bool empty() const; // is the list empty?
Iterator begin() const; // beginning position
Iterator end() const; // (just beyond) last position
void insertFront(const Elem& e); // insert at front
void insertBack(const Elem& e); // insert at rear
void insert(const Iterator& p, const Elem& e); // insert e before p
void eraseFront(); // remove first
void eraseBack(); // remove last
void erase(const Iterator& p); // remove p
// housekeeping functions omitted...
private: // data members
int n; // number of items
Node* header; // head-of-list sentinel
Node* trailer; // tail-of-list sentinel
};
#endif /* NODELIST_H */
#include "NodeList.h"
#include <iostream>
using namespace std;
NodeList::NodeList()
{ // constructor
n = 0; // initially empty
header = new Node; // create sentinels
trailer = new Node;
header->next = trailer; // have them point to each other
trailer->prev = header;
}
int NodeList::size() const // list size
{ return n; }
bool NodeList::empty() const // is the list empty?
{ return (n == 0); }
NodeList::Iterator NodeList::begin() const // begin position is first item
{ return Iterator(header->next); }
NodeList::Iterator NodeList::end() const // end position is just beyond last
{ return Iterator(trailer); }
void NodeList::erase(const Iterator& p)
{ // remove p
Node* v = p.v; // node to remove
Node* w = v->next; // successor
Node* u = v->prev; // predecessor
u->next = w; w->prev = u; // unlink p
delete v; // delete this node
n--; // one fewer element
}
void NodeList::eraseFront() // remove first
{ erase(begin()); }
void NodeList::eraseBack() // remove last
{ erase(--end()); }
void NodeList::insert(const NodeList::Iterator& p, const Elem& e)
{
Node* w = p.v; // p's node
Node* u = w->prev; // p's predecessor
Node* v = new Node; // new node to insert
v->elem = e;
v->next = w; w->prev = v; // link in v before w
v->prev = u; u->next = v; // link in v after u
n++;
}
void NodeList::insertFront(const Elem& e) // insert at front
{ insert(begin(), e); }
void NodeList::insertBack(const Elem& e) // insert at rear
{ insert(end(), e); }
#include "Iterator.h"
#include <iostream>
using namespace std;
NodeList::Iterator::Iterator(Node* u) // constructor from Node*
{ v = u; }
Elem& NodeList::Iterator::operator*() // reference to the element
{ return v->elem; }
// compare positions
bool NodeList::Iterator::operator==(const Iterator& p) const
{ return v == p.v; }
bool NodeList::Iterator::operator!=(const Iterator& p) const
{ return v != p.v; }
// move to next position
NodeList::Iterator& NodeList::Iterator::operator++()
{ v = v->next; return *this; }
// move to previous position
NodeList::Iterator& NodeList::Iterator::operator--()
{ v = v->prev; return *this; }
解决方案
您的Iterator
类是在全局命名空间中定义的,但是当您定义它的方法时,您将其限定为嵌套类NodeList
:NodeList::Iterator
应该只是Iterator
.
推荐阅读
- jquery - jQuery Chrome 不接受隐藏按钮
- sql-server - “恢复挂起”后缺少 SQL Server MDF 文件
- php - 传递的具体类而不是具有实现接口 php 的类
- vb.net - 如何获取 Temp 目录 vb.net 中的所有文件?
- android - 有没有办法让 Unity DebugKey 变成非 Debug 键?
- android - ACTION_MEDIA_BUTTON 在 BroadcastReceiver 中不起作用
- reactjs - 反应服务器端渲染如何在viewsource中显示html
- symfony - Symfony 3.4:无法从控制台命令清除实体缓存
- python - 使用循环更改 2d 列表值不正确
- ecmascript-6 - Underscore 的 _.indexBy() 的 ES6 版本