免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: catbert
打印 上一主题 下一主题

iterator 问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-04-01 11:39 |只看该作者
原帖由 converse 于 2006-3-31 13:57 发表
你的mylist是模板类?那你就只能这么写了:friend class mylist<mynode>::iterator;


不是,当都是模版的时候没有问题。

论坛徽章:
0
12 [报告]
发表于 2006-04-01 18:46 |只看该作者
mylist 的完整定义贴一下。

论坛徽章:
0
13 [报告]
发表于 2006-04-03 21:36 |只看该作者
原帖由 wolf0403 于 2006-4-1 05:46 发表
mylist 的完整定义贴一下。

  1. #ifndef _MYLIST_H
  2. #define _MYLIST_H
  3. #include <iostream>
  4. #include "mynode.h"
  5. using namespace std;

  6. class mylist::iterator;
  7. class mylist {
  8. public:
  9.   class iterator;
  10.   friend class iterator;
  11.   mylist();
  12.   mylist(int n, const int & item = 0);
  13.   mylist(int *first, int *last);
  14.   mylist(const mylist &obj);
  15.   mylist &operator=(const mylist &rhs);
  16.   int &back() {return header->prev->nodeValue;};
  17.   bool empty() const {return listSize==0;};
  18.   int &front() {return header->next->nodeValue;};
  19.   void push_back(const int &item);
  20.   void pop_back();
  21.   void push_front(const int &item);
  22.   void pop_front();
  23.   int size() {return listSize;};
  24.   iterator begin() {return iterator(header->next);};
  25.   iterator end() {return iterator(header);};
  26.   virtual ~mylist();
  27.   class iterator {
  28.   public:
  29.     iterator():nodePtr(header) {};
  30.     iterator(mynode *p):nodePtr(p){};
  31.     bool operator==(const iterator &rhs) const {
  32.       return (nodePtr == rhs.nodePtr);
  33.     }
  34.     bool operator!=(const iterator &rhs) const {
  35.       return (nodePtr != rhs.nodePtr);
  36.     }
  37.     int &operator * () {
  38.       return nodePtr->nodeValue;
  39.     }
  40.     iterator operator++() {
  41.       nodePtr = nodePtr->next;
  42.       iterator itertmp = *this;
  43.       return itertmp;
  44.     }
  45.     iterator operator++(int) {
  46.       iterator itertmp = *this;
  47.       nodePtr = nodePtr->next;
  48.       return itertmp;
  49.     }
  50.     iterator operator--() {
  51.       nodePtr = nodePtr->prev;
  52.       iterator itertmp = *this;
  53.       return itertmp;
  54.     }
  55.     iterator operator--(int) {
  56.       iterator itertmp = *this;
  57.       nodePtr = nodePtr->prev;
  58.       return itertmp;
  59.     }
  60.   private:
  61.     mynode *nodePtr;
  62.   };
  63. private:
  64.   mynode *header;
  65.   int listSize;
  66.   mynode *getnode(const int &item);
  67.   mynode *dinsert(mynode *curr, const int &item);
  68.   void derase(mynode *curr);
  69. };

  70. mylist::mylist():listSize(0) {
  71.   header = new mynode;

  72.   header->nodeValue = 0;
  73.   header->next = header;
  74.   header->prev = header;
  75. }
  76. mylist::mylist(int n, const int &item):listSize(n) {
  77.   int i;
  78.   header = new mynode;
  79.   for (i=0; i<n; i++) {
  80.     dinsert(header->next, item);
  81.   }
  82. }

  83. mylist::mylist(const mylist &obj):listSize(obj.listSize) {
  84.   mynode *curr=obj.header->next, *end=obj.header;

  85.   header = new mynode;
  86.   while (curr != end) {
  87.     dinsert(header, curr->nodeValue);
  88.     curr = curr->next;
  89.   }
  90. }

  91. mylist &mylist::operator=(const mylist & rhs) {
  92.   mynode *curr;
  93.   if (header != rhs.header) {
  94.     while (header->next != header) {
  95.       curr = header->next;
  96.       curr = curr->next;
  97.       derase(curr->prev);
  98.     }
  99.     mynode *rptr;
  100.     if (rhs.listSize != 0) {
  101.       rptr = rhs.header;
  102.       while (rptr->next != rhs.header) {
  103.         push_back(rptr->next->nodeValue);
  104.         rptr = rptr->next;
  105.       }
  106.     }
  107.   }
  108.   return *this;
  109. }

  110. void mylist::push_front(const int &item) {
  111.   dinsert(header->next, item);
  112.   listSize++;
  113. }

  114. void mylist::push_back(const int &item) {
  115.   dinsert(header, item);
  116.   listSize++;
  117. }

  118. void mylist::pop_front() {
  119.   derase(header->next);
  120.   listSize--;
  121. }

  122. void mylist::pop_back() {
  123.   derase(header->prev);
  124.   listSize--;
  125. }

  126. mylist::~mylist() {
  127.   mynode *curr;

  128.   while (header->next != header) {
  129.     curr = header->next;
  130.     curr = curr->next;
  131.     derase(curr->prev);
  132.   }
  133. }

  134. mynode* mylist::getnode(const int &item){
  135.   mynode *curr;
  136.   curr = new mynode;
  137.   curr->nodeValue = item;
  138.   return curr;
  139. }

  140. mynode* mylist::dinsert(mynode *curr, const int &item) {
  141.   mynode *tmptr;

  142.   tmptr = getnode(item);
  143.   tmptr->prev = curr->prev;
  144.   curr->prev->next = tmptr;
  145.   tmptr->next = curr;
  146.   curr->prev = tmptr;
  147.   return tmptr;
  148. }

  149. void mylist::derase(mynode *curr) {
  150.   curr->prev->next = curr->next;
  151.   curr->next->prev = curr->prev;
  152.   delete curr;
  153. }

  154. #endif
复制代码

[ 本帖最后由 catbert 于 2006-4-3 08:37 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP