链表编译出错(代码),求助

Gs_byte 2005-08-08 12:10:10
//一涉及模板,老编译出错,却检查不出来哪里的毛病,求助。


//link.h
#ifndef link_h
#define link_h

template<class T>
class link
{
link<T>* insert(T val);
private:
link(T linkValue,link<T>* nextPtr);
link(const link<T>& source);

link<T>* duplicate()const;
T value;
link<T>* ptrToNextLink;

friend class list<T>;
friend class listIterator<T>;
};

template<class T>
link<T>::link(T val,link<T>* next)
:value(val),ptrToNextLink(next)
{}
template<class T>
link<T>::link(const link<T> &source)
:value(source.value),ptrToNextLink(source.ptrToNextLink)
{}

template<class T>
link<T>* link<T>::insert(T val)
{//insert a value and place it to the behind of current value

ptrToNextLink=new link<T>(val,ptrToNextLink);
assert(ptrToNextLink!=0);
return ptrToNextLink;
}
template<class T>
link<T>* Link<T>::duplicate()const
{
link<T> *newlink;
if(ptrToNextLink!=0)
newlink=new link<T>(value,ptrToNextLink->duplicate());
else
newlink=new link<T>(value,0);
assert(newlink!=0);
return newlink;
}
#endif
//list.h
#ifndef list_h
#define list_h

#include "link.h"
template<class T>
class list
{
public:
list();
list(const list<T> & source);
virtual ~list();

virtual void add(T add);
virtual void deleteAllValues();
T firstElement()const;
virtual int include(T value)const;
int isEmpty()const;
virtual void removeFirst();
list<T>* duplicate()const;
protected:
link<T>* ptrToFirstLink;
friend class listIterator<T>;
};
template<class T>
list<T>::list()
:ptrToFirstLink(0);
{}
template<class T>
int list<T>::isEmpty()const
{
return ptrToFirstLink==0;
}
template<class T>
void list<T>::add(T val)
{//insert a given new node before the first node
ptrToFirstLink=new link<T>(val,ptrToFirstLink);
assert(ptrToFirstLink!=0);
}
template<class T>
T list<T>::firstElement()const
{
assert(ptrToFirstLink!=0);
return ptrToFirstLink->value;
}
template <class T>
void list<T>::removeFirst()
{
assert(ptrToFirstLink!=0);
link<T>* p=ptrToFirstLink;
ptrToFirstLink=p->ptrToNextLink;
delete p;
}
template<class T>
int list<T>::include(T v)const
{
for(link<T>* p=ptrToFirstLink;p;p->ptrToNextLink)
{
if(v==p->value)return 1;
}
return 0;
}
template<class T>
void list<T>::deleteAllValues()
{
link<T>* next;
for(link<T> *p=ptrToFirstLink;p!=0;p=next)
{
next=p->ptrToNextLink;
p->ptrToNextLink=0;
delete p;
}
ptrToFirstLink=0;
}
template<class T>
list<T>* list<T>::duplicate()const
{
list<T> *newlist=new list<T>;
assert(newlist!=0);
if(ptrToFirstLink)
newlist->ptrToFirstLink=ptrToFirstLink->duplicate();
return newlist;
}
template<class T>
list<T>::list(const list<T>& source)
{
if(source.isEmpty())
ptrToFirstLink=0;
else
{
link<T> * firstLink=source.ptrToFirstLink;
ptrtoFirstLink=firstLink->duplicate();
}
}
template<class T>
list<T>::~list()
{
deleteAllValues();
}
#endif

//test.h

#include "link.h"
#include "list.h"

int main()
{
list<int> lst;
lst.add(2);
lst.add(5);
lst.add(1);
lst.add(9);
lst.add(5);

}

...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2005-08-08
  • 打赏
  • 举报
回复
呀!最后一个test.cpp源代码贴串了行了啊!
不好意思啊
xiaocai0001 2005-08-08
  • 打赏
  • 举报
回复
是啊,我把改过的贴出来,你对照着看看
//link.h
#ifndef link_h
#define link_h

template <class T> class list; //=====增加部分
template <class T> class listIterator; //=====增加部分

template<class T>
class link
{
link<T>* insert(T val);
private:
link(T linkValue,link<T>* nextPtr);
link(const link<T>& source);

link<T>* duplicate()const;
T value;
link<T>* ptrToNextLink;

friend class list<T>;
friend class listIterator<T>;
};

template<class T>
link<T>::link(T val,link<T>* next):value(val),ptrToNextLink(next)
{}

template<class T>
link<T>::link(const link<T> &source):value(source.value),ptrToNextLink(source.ptrToNextLink)
{}

template<class T>
link<T>* link<T>::insert(T val)
{//insert a value and place it to the behind of current value

ptrToNextLink=new link<T>(val,ptrToNextLink);
assert(ptrToNextLink!=0);
return ptrToNextLink;
}

template<class T>
link<T>* link<T>::duplicate()const //====这儿一处,你把Link大写了
{
link<T> *newlink;
if(ptrToNextLink!=0)
newlink=new link<T>(value,ptrToNextLink->duplicate());
else
newlink=new link<T>(value,0);
assert(newlink!=0);
return newlink;
}
#endif

//list.h

#ifndef list_h
#define list_h
#include "assert.h" //====你在定义中用到了assert()函数,需要包含头文件

template <class T> class link; //声明部分
template <class T> class listIterator; //声明部分

template <class T>
class list
{
public:
list();
list(const list<T> & source);
virtual ~list();

virtual void add(T add);
virtual void deleteAllValues();
T firstElement()const;
virtual int include(T value)const;
int isEmpty()const;
virtual void removeFirst();
list<T> *duplicate()const;
protected:
link <T> *ptrToFirstLink;
friend class listIterator<T>;
};
template<class T>
list<T>::list():ptrToFirstLink(0)
{
}

template<class T>
int list<T>::isEmpty()const
{
return ptrToFirstLink==0;
}

template<class T>
void list<T>::add(T val)
{//insert a given new node before the first node
ptrToFirstLink=new link<T>(val,ptrToFirstLink);
assert(ptrToFirstLink!=0);
}

template<class T>
T list<T>::firstElement()const
{
assert(ptrToFirstLink!=0);
return ptrToFirstLink->value;
}

template <class T>
void list<T>::removeFirst()
{
assert(ptrToFirstLink!=0);
link<T>* p=ptrToFirstLink;
ptrToFirstLink=p->ptrToNextLink;
delete p;
}

template<class T>
int list<T>::include(T v)const
{
for(link<T>* p=ptrToFirstLink;p;p->ptrToNextLink)
{
if(v==p->value)return 1;
}
return 0;
}

template<class T>
void list<T>::deleteAllValues()
{
link<T>* next;
for(link<T> *p=ptrToFirstLink;p!=0;p=next)
{
next=p->ptrToNextLink;
p->ptrToNextLink=0;
delete p;
}
ptrToFirstLink=0;
}

template<class T>
list<T>* list<T>::duplicate()const
{
list<T> *newlist=new list<T>;
assert(newlist!=0);
if(ptrToFirstLink)
newlist->ptrToFirstLink=ptrToFirstLink->duplicate();
return newlist;
}

template<class T>
list<T>::list(const list<T>& source)
{
if(source.isEmpty())
ptrToFirstLink=0;
else
{
link<T> * firstLink=source.ptrToFirstLink;
ptrtoFirstLink=firstLink->duplicate();
}
}

//test.cpp
#include "link.h"
#include "list.h"

int main()
{
list<int> lst;
lst.add(2);
lst.add(5);
lst.add(1);
lst.add(9);
lst.add(5);
return 0;//====你用的是int main()需要有返回值
}


template<class T>
list<T>::~list()
{
deleteAllValues();
}
#endif

Gs_byte 2005-08-08
  • 打赏
  • 举报
回复
问题是剩下的几处错误还是找不出来,你都能编译通过吗?
xiaocai0001 2005-08-08
  • 打赏
  • 举报
回复
找到了,在list.h文件里list类定义前加上以下两句
 template <class T> class link;
 template <class T> class listIterator;
在link.h文件里link类定义前加上
 template <class T> class list;
就可以了。
还有其它几处小错误,你一编译就知道在哪儿出错了。
xiaocai0001 2005-08-08
  • 打赏
  • 举报
回复
关于链表类的声明,我不太清楚。你可以查查资料
Gs_byte 2005-08-08
  • 打赏
  • 举报
回复
我试过了还是不可以啊,出了好多错误,我一个检查不出来
xiaocai0001 2005-08-08
  • 打赏
  • 举报
回复
主要是因为,你两个类在定义时互相使用了。而类在使用前需要先声明一下,就和函数声明一样,唯一不同的是你这个是模板类。
举个例子,现在有两个类A,B
//A.h
class A
{
private:
B *instance_B;
……;
public:
……;
};

//B.h
class B
{
private:
A *instance_A;
……;
public:
……;
};
如果直接编译的话是不会通过的。
改成:

//A.h
class B; //先声明一下类B

class A
{
private:
B *instance_B;
……;
public:
……;
};

//B.h
class A; //先声明一下类A

class B
{
private:
A *instance_A;
……;
public:
……;
};

这样就可以了。你的程序不同在于这两个类都是模板类而已。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧