随笔 - 7  文章 - 15  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(2)

随笔档案(7)

相册

搜索

  •  

积分与排名

  • 积分 - 15594
  • 排名 - 945

最新评论

阅读排行榜

评论排行榜

还是我做的那个链表的模板类
我分别写了头文件Chain.h,源文件Chain.cpp,并且在main.cpp中进行测试。
但是在连接的时候出现了问题,不知道什么原因,希望能够有高手指点一下,非常感谢!

其中Chain.h声明了类的数据成员和成员函数,具体内容如下:

#ifndef _CHAIN_H
#define _CHAIN_H

#include <iostream>
using namespace std;

template<class T>
class Chain;


template<class T>
class ChainNode
{
 friend class Chain<T>;
 friend ostream& operator<<(ostream& out, const Chain<T>& x);
private:
 T data;
 ChainNode<T> *link;
};

template<class T>
class Chain{

public:
 Chain(int p) {first = 0;};
 ~Chain();
 bool IsEmpty() const {return first == 0;}
 int Length() const;
 bool Find(int k, T& x) const;
 int Search(const T& x) const;
 //Chain<T>& Delete(int k, T& x);
 Chain<T>& Insert(int k, const T& x);
 void Output(ostream& out = cout) const;
private:
 ChainNode<T> *first; // 指向第一个节点的指针
};

template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x);

#endif  // _CHAIN

  在Chain.cpp中对Chain.h中声明的函数进行了定义,具体内容如下:

#include "Chain.h"
#include <iostream>
using namespace std;

template<class T>
Chain<T>::~Chain()
{
 //链表的析构函数,用于删除链表中的所有节点
 ChainNode<T> *ptr = first;
 while (ptr)
 {
  first = ptr->link;
  delete ptr;
  ptr = first;
 }
}

template<class T>
int Chain<T>::Length() const
{
 //返回链表中的元素总数
 int count = 0;
 ChainNode<T> *ptr = first;
 while (ptr)
 {
  ++count;
  ptr = ptr->link;
 }
 return count;
}

template<class T>
bool Chain<T>::Find(int k, T& x) const
{
 //寻找链表中的第k个元素,并将其传送至x
 //如果不存在第k个元素,则返回false,否则返回true
 if (k < 1)
 {
  return false;
 }
 int count = k;
 ChainNode<T> *ptr = first;
 while (count && ptr)
 {
  --count;
  ptr = ptr->link
 }
 if (!ptr)
 {
  return false;
 }
 x = ptr->data;
 return true;
}

template<class T>
int Chain<T>::Search(const T& x) const
{
 //寻找x,如果发现x,则返回x的地址
 //如果x不在链表中,则返回0
 int count = 1;
 ChainNode<T> *ptr = first;
 while(ptr && (ptr->data!=x))
 {
  ++count;
  ptr = ptr->link;
 }
 if (ptr)
 {
  return count;
 }
 else
 {
  return 0;
 }
}

template<class T>
void Chain<T>::Output(ostream& out = cout) const
{
 ChainNode<T> *ptr = first;
 while (ptr)
 {
  out<<ptr->data<<"  ";
  ptr = ptr->link;
 }
}

//重载<<运算符
template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{
 x.Output(out);
 return out;
}

template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{
 ChainNode<T> *ptr = first;
 int count = 0;
 while (ptr && count < k)
 {
  ++count;
  ptr = ptr->link;
 }
 if (!ptr)  //如果没到第k个节点
 {
 
 }
 else
 {
  //要插入的新节点
  ChainNode<T>* cn = new ChainNode<T>;
  cn->data = x;
  cn->link = 0;
  if (ptr->link==0)  //到达了链表的结尾
  {
   ptr->link = cn;
  }
  else  //没到达结尾
  { 
   cn->link = ptr->link;
   ptr->link = cn;
  }
 }
 return *this
}

 在main.cpp中进行测试,测试的内容很少,但是刚开始就进行不了了。main.cpp内容如下:

#include "Chain.h"
using namespace std;

int main()
{
 Chain<int> c;
 cout<<c.Length();
 return 0;
}

编译的时候没有问题,但是在连接的时候就出现了问题,报错如下:
--------------------Configuration: Chain - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Chain<int>::~Chain<int>(void)" (
??1?$Chain@H@@QAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall Chain<int>::Length(void)const " (
?Length@?$Chain@H@@QBEHXZ)
Debug/Chain.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

Chain.exe - 3 error(s), 0 warning(s)
但是从报错信息来看,应该是在main.cpp中没有找到所用到的函数 ~Chain<int>(void)和Length()的定义,在main.cpp中一共用到了三个函数,构造函数Chain(),但是构造函数是在Chain.h中定义的,所以编译器找到了其定义,但是另外两个函数是在Chain.cpp中定义的,而且目前报错没有找到,但是如果在main.cpp中引入#include "Chain.cpp"时,编译和连接就没有问题,这就证实了原来的估计是没有错的。我实在是不知道问题出现在哪里,所以希望哪位高手看出问题来的话,请告诉我,多谢了!

posted on 2006-06-19 16:56 Bourne 阅读(820) 评论(4)  编辑 收藏 引用

FeedBack:
# re: VC++中的连接问题,请大侠帮忙,我快崩溃了 2006-06-19 18:20 CoderDream
将Chain.h 和 Chain.cpp 合并成一个文件,然后修改主函数中的第一句:
Chain<int> c(666);//要带参数,不然没有匹配的构造函数

但是运行结果为0,显然不对,再看看哪里出了问题。

有模板时最好将函数的声明和定义写在同一个文件中  回复  更多评论
  
# re: VC++中的连接问题,请大侠帮忙,我快崩溃了 2006-06-19 18:54 万连文
模板的实现最好在.h里面,如果非要象你那样也可以,在.h里面包含.cpp。  回复  更多评论
  
# re: VC++中的连接问题,请大侠帮忙,我快崩溃了 2006-06-19 20:01 笑笑生
#include "Chain.h"->#include "Chain.cpp"
using namespace std;

int main()
{
Chain<int> c;
cout<<c.Length();
return 0;
}  回复  更多评论
  
# re: VC++中的连接问题,请大侠帮忙,我快崩溃了 2006-06-19 21:44 Bourne
我采取在main.cpp直接引入Chain.cpp的方法了

#include "Chain.h"->#include "Chain.cpp"
多谢各位的帮助阿!  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理