首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++中模板类的继承有关问题

2012-03-05 
C++中模板类的继承问题问题说明:1、定义了一个myList的链表模板类;2、定义了一个mySet的集合类,共有public继

C++中模板类的继承问题
问题说明:
1、定义了一个myList的链表模板类;
2、定义了一个mySet的集合类,共有public继承myList模板类。

请问:
1、在for循环中出现了Node指针未定义问题;

2、开始时出现了Node指针p、pHead、Node未定义的错误;在p、Node、和pHead前面添加myList<T>::或者myset<T>::作用域限制后,Node和pHead错误消失;此时p仍有错误:p在此作用域未定义;

3、不知道为什么要在在Node结点前面添加myList<T>::或者myset<T>::作用域限制。

4、出错代码如下所示:

[code=C/C++][/code]
template <class T>
bool mySet<T>::Contains(T &t)
{
//myList<T>::Node *p;
//myList<T>::Node *

//;myset<T>换成myList<T>也可以;
 
//for (mySet<T>::Node *p = mySet<T>::pHead;p != NULL ; p = p->pNext) //此处出错?????
if ((p->data) == t)
return true;
return false;
}

错误提示:[Error] D:\C++学习\11\ListPro\mySet.h:22: error: `p' was not declared in this scope。

5、希望高手能指点一下,分数不多,倾囊而出!

6、程序源代码如下:

//myList类模板的定义;由于winGW不支持模板分离编译,故把myList模板类的声明和定义放在同一个头文件:myList.h
//*****************myList.h************************头文件*********************;

[code=C/C++][/code]
#ifndef _MYLIST_H_
#define _MYLIST_H_

///#include "myList.h"模板中的 .h 和 .cpp 文件必须放在一起, ,mingW不支持
//模板分离编译;vc应该可以的 
/*
功能扩展:查找函数,比较函数,打印指定的元素;统计元素的个数; 
*/

#include <iostream>

using std::cout;
using std::cin;
using std::endl;


//定义一个带一个参数的list模板类 :mylist<T>
template <class T>
class myList
{
public:
myList();//构造函数 ;
void remove(T &);//删除一个元素; 
void printList();//打印链表;
 
virtual void add(T &);//添加一个元素;
virtual ~myList();//析构函数; 

protected:
struct Node//结点类型; 
{
Node *pNext;
T data;
};

Node *pHead;//链表的表头; 
};

template <class T>
myList<T>::myList()
{
pHead = NULL;
}

template <class T>
void myList<T>::add(T &t)
{
Node *temp = new Node;
temp->data = t;
temp->pNext = pHead;
pHead = temp;
}

template <class T>
void myList<T>::remove(T &t)
{
Node *q = 0;

//如果待删除结点是表头结点,则删除;表头。指针向下一个结点;
 
if ((pHead->data) == t)

{
q = pHead;
pHead = pHead->pNext;
}

//顺序查找待删除的节点; 
else
{
for (Node *p = pHead; p->pNext != NULL; p = p->pNext)
if ((p->pNext->data) == t)
{
q = p->pNext;
p->pNext = q->pNext;
break;
}
}

if (q != NULL)
{
delete q;
q = NULL;//删除指针指向的对象后,应将指针归NULL,避免野指针的出现; 
}

}

template <class T>
void myList<T>::printList()
{//顺序打印链表中的节点; 
for (Node *p = pHead; p != NULL; p = p->pNext)
cout << p->data <<'\t';
cout << endl;
}

template <class T>
myList<T>::~myList()
{
Node *p;

//顺序删除结点; 
while(pHead != NULL)
{
p = pHead;
pHead = pHead->pNext;
delete p;

}
p = NULL;
}
#endif 


[code=C/C++][/code]
***********************************mySet.h****************************************************
#ifndef _MYSET_H_
#define _MYSET_H_

#include <iostream>
#include "myList.h"

template <class T>
class mySet: public myList<T>
{
public:
bool Contains(T &);
void add (T &);
};

template <class T>
bool mySet<T>::Contains(T &t)
{
//myList<T>::Node *p;
//myList<T>::Node *

//;myset<T>换成myList<T>也可以;


 
//for (mySet<T>::Node *p = mySet<T>::pHead;p != NULL ; p = p->pNext)
if ((p->data) == t)
return true;
return false;
}

template <class T>
void mySet<T>::add(T &t)
{
if (!Contains(t))
myList<T>::add(t);
}

#endif



[解决办法]
好长的代码啊,看看C++编程思想 下卷 第五章 深入模板编程
[解决办法]
代码太长,纯支持
[解决办法]
template <class T>
class myList
{
public:
typedef struct Node Node;
myList(); //构造函数 ;
void remove(T &); //删除一个元素;
void printList(); //打印链表; 
  
virtual void add(T &); //添加一个元素; 
virtual ~myList(); //析构函数;

protected: 
struct Node //结点类型;
{
Node *pNext;
T data;
};

typename myList<T>::Node *p;
这样试试吧

[解决办法]
DEV-CPP也编译通过

热点排行