一菜鸟的送分问题: 高手指教
一程序
vc6中文件结构如下
workspace "list"
list files
source files
list.cpp
list_2.cpp
header files
list.h
list_2.cpp为
#include "list.h"
#include <iostream>
using namespace std;
void main()
{ Ilist mylist;
for(int xi=0;xi<10;xi++)
{ mylist.insert_front(xi);
mylist.insert_end(xi);
}
mylist.display();
}
insert_front 是list 类的成员函数
在vc6中连接失败
list_2.obj : error LNK2001: unresolved external symbol "public: void __thiscall Ilist::insert_end(int)" (?insert_end@Ilist@@QAEXH@Z)
list_2.obj : error LNK2001: unresolved external symbol "public: void __thiscall Ilist::insert_front(int)" (?insert_front@Ilist@@QAEXH@Z)
list_2.obj : error LNK2001: unresolved external symbol "public: __thiscall Ilist::Ilist(void)" (??0Ilist@@QAE@XZ)
Debug/list.exe : fatal error LNK1120: 3 unresolved externals
把main 放到 list.cpp中便成功了
为什么?
问题点数:50、回复次数:16Top
1 楼zhaozhencn(FlyingDonkey)回复于 2003-02-01 20:30:29 得分 5
是不是在你的list.cpp 和list_2.cpp中都定义了main函数。。Top
2 楼micropentium6(小笨|曾经的美好)回复于 2003-02-01 20:39:43 得分 5
是你的头文件重复include了吧?:)
你没有使用包含保护吧?
头文件是只能加载一回的。Top
3 楼liguang1981(少侠)回复于 2003-02-01 21:50:20 得分 0
list.cpp是对成员函数的定义
当然要有#include "list.h"
""是不是在你的list.cpp 和list_2.cpp中都定义了main函数。。""
当然没有
""你没有使用包含保护吧?""
包含保护 是什么?
Top
4 楼qhgary(Gary)回复于 2003-02-02 18:27:37 得分 5
包含保护:
比如:
list.h
在前面加上 #ifndef LIST_H
#define LIST_H
在文件末尾加上
#endif
这样就可以互相包含了,编译器会自动判断,如果没有包含就包含,如果包含了,就不再包含。避免重复包含文件。Top
5 楼HongHuer(Hello,world.)回复于 2003-02-02 19:33:40 得分 5
1 Ilist::insert_end(int) 这个函数的函数体写了吗?
2 Ilist::insert_front(int)这个函数的函数体写了吗?
3 Ilist::Ilist(void) 这个函数的函数体写了吗?
如果上面的函数写了,象你这样写,应该没有错的。
list_2.cpp为
#include "list.h"
#include <iostream>
using namespace std;
void main()
{ Ilist mylist;
for(int xi=0;xi<10;xi++)
{ mylist.insert_front(xi);
mylist.insert_end(xi);
}
mylist.display();
}
Top
6 楼micropentium6(小笨|曾经的美好)回复于 2003-02-02 22:46:23 得分 5
如果你的一个头文件#include "list.h"在两个cpp文件中,那么肯定是有问题的!相应的处理方法称为include guard,包含守卫,shining已经给你解释了:)Top
7 楼liguang1981(少侠)回复于 2003-02-03 12:48:47 得分 0
首先谢谢大家的帮助
我做了如下修改
list.h
加上 #ifndef LIST_H
#define LIST_H
//list.h 的内容
#endif
list.cpp
中
#include "list.h"
#include <iostream>
using namespace std;
list_2.cpp
中
#include "list.h"
#include <iostream>
using namespace std;
这样对不对?
怎么连接还是不通过
请告知具体应怎么做
谢谢
Top
8 楼huanshilang(幻十郎)回复于 2003-02-03 13:02:21 得分 0
学习 学习Top
9 楼HongHuer(Hello,world.)回复于 2003-02-03 13:30:14 得分 0
这样对不对?
怎么连接还是不通过
请告知具体应怎么做
谢谢
>>
对。
你的头文件写好了没有,函数体写了没有?
连接通不过,怎样通不过?
说编译的错误。
怎么这么简单的问题还要搞这么久?
把问题说清楚。Top
10 楼liguang1981(少侠)回复于 2003-02-03 19:05:18 得分 0
麻烦大家了,再看一下吧
Top
11 楼liguang1981(少侠)回复于 2003-02-03 19:06:17 得分 0
list.h内容
#ifndef LIST_H
#define LIST_H
class Ilist_item;
class Ilist
{ public:
Ilist();
void insert(Ilist_item *p,int value);
void insert_front(int value);
void insert_end(int value);
void add_size();
void down_size();
Ilist_item *find(int);
void display();
private:
Ilist_item *at_front;
Ilist_item *at_end;
int _size;
};
class Ilist_item
{ public:
Ilist_item(int value,Ilist_item *p=0);
Ilist_item *next(Ilist_item *link=0);
int value(){return _value;}
private:
int _value;
Ilist_item *_next;
};
#endifTop
12 楼liguang1981(少侠)回复于 2003-02-03 19:09:23 得分 0
list.cpp内容
#include "list.h"
#include <iostream>
using namespace std;
inline Ilist::Ilist():at_front(0),at_end(0),_size(0)
{}
inline void Ilist::insert(Ilist_item *p,int value)
{ if(p) {
new Ilist_item(value,p);
add_size();}
else
insert_front(value);
}
inline void Ilist::add_size()
{ _size++;}
inline void Ilist::down_size()
{_size--;}
inline void Ilist::insert_front(int value)
{ Ilist_item *p=new Ilist_item(value);
if(!at_front)
at_front=at_end=p;
else
{ at_front=p->next(at_front);
at_front=p;
}
add_size();
}Top
13 楼prf8(机关报)回复于 2003-02-04 00:29:34 得分 15
我试了一下,通过了,主要是你的定义和实现不同造成的.
而且,构造函数好象不能用内联,你应去掉inline;
另外,你在何处定义的Ilist_item的实现也包含进你的list_2.cpp,
最后,再检查一遍你的声明和你的定义是否完全一致,我想就没有问题了.都是你粗心惹的祸.Top
14 楼HongHuer(Hello,world.)回复于 2003-02-04 11:05:15 得分 10
初步看了一下:
你在头文件怎么申明的函数,就应该在原文件中怎么定义。
(每个所申明的函数都应该有函数体)
类型不一致,就会有你上面的编译错误。
有的函数没有函数体。
最大的问题就是这点。
Top
15 楼liguang1981(少侠)回复于 2003-02-05 17:20:27 得分 0
对了,谢谢!
麻烦大家了!
Top
16 楼liguang1981(少侠)回复于 2003-02-05 17:27:04 得分 0
我把 inline void Ilist::insert_front(int value)
inline void Ilist::insert_end(int value)
的inline去掉就对了
谢谢大家!
Top




