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

求教一个关于链接的有关问题

2012-03-01 
求教一个关于链接的问题本人在VC++6下创建了一个简单的工程SortArray,包括两个头文件和两个源文件:MyArray

求教一个关于链接的问题
本人在VC++   6下创建了一个简单的工程SortArray,   包括两个头文件和两个源文件:   MyArray.h,   SortArray.h,   MyArray.cpp,   SortArray.cpp.
通过了编译,但链接时出错了,我不知如何修改,希望高手指教,错误信息如下:
SortArray.obj   :   error   LNK2005:   "public:   __thiscall   MyArray::MyArray(int) "   (??0MyArray@@QAE@H@Z)   already   defined   in   MyArray.obj
SortArray.obj   :   error   LNK2005:   "public:   __thiscall   MyArray::~MyArray(void) "   (??1MyArray@@QAE@XZ)   already   defined   in   MyArray.obj
SortArray.obj   :   error   LNK2005:   "public:   void   __thiscall   MyArray::Display(void) "   (?Display@MyArray@@QAEXXZ)   already   defined   in   MyArray.obj
SortArray.obj   :   error   LNK2005:   "public:   void   __thiscall   MyArray::Input(void) "   (?Input@MyArray@@QAEXXZ)   already   defined   in   MyArray.obj
Debug/SortArray.exe   :   fatal   error   LNK1169:   one   or   more   multiply   defined   symbols   found
Error   executing   link.exe.

SortArray.exe   -   5   error(s),   0   warning(s)

各个文件如下:
//MyArray.h
class   MyArray
{
public:
MyArray(int   leng);
~MyArray();
void   Input();
void   Display();
protected:
int   *alist;
int   length;
};

//MyArray.cpp
#include   <process.h>    
#include   "MyArray.h "

using   namespace   std;

MyArray::MyArray(int   leng)
{
if   (leng <=0)
{
cout   < <   "error   length ";
exit(1);
}
alist   =   new   int   [leng];
length   =   leng;
if   (alist   ==   NULL)
{
cout   < <   "assign   failure ";
exit(1);
}
cout   < <   "MyArray   created. "   < <   endl;
}
MyArray::~MyArray()
{
delete[]   alist;
cout   < <   "MyArray   dying. "   < <   endl;
}
void   MyArray::Display()
{
int   i;
int   *p   =   alist;
for   (i=0;i <length;i++,p++)
cout   < <   "   "   < <   *p;
cout   < <   endl;
}
void   MyArray::Input()
{
cout   < <   "Please   input   "   < <   length   < <   "   integer: ";
int   i;
int   *p   =   alist;
for   (i=0;i <length;i++,p++)
cin   > >   *p;
}

//SortArray.h
class   SortArray   :   public   MyArray
{
public:
        SortArray(int   lengh);
virtual   ~SortArray();
void   Sort();
};

//SortArray.cpp
#include   <iostream>
#include   <process.h>
#include   "MyArray.cpp "
#include   "SortArray.h "

using   namespace   std;

SortArray::SortArray(int   lengh):MyArray(lengh)
{
cout   < <   "SortArray   creating. "   < <   endl;
}
SortArray::~SortArray()


{
cout   < <   "SortArray   dying. "   < <   endl;
}
void   SortArray::Sort()
{
int   i,   j,   temp;
for   (i=0;i <length-1;i++)
for   (j=0;j <length-i-1;j++)
if   (alist[j] <alist[j+1])
{
temp   =   alist[j];
alist[j]   =   alist[j+1];
alist[j+1]   =   temp;
}
}

void   main()
{
cout   < <   "\nBegin:\n ";
SortArray   s(5);
s.Input();
s.Display();
s.Sort();
s.Display();
}



[解决办法]
#include "MyArray.cpp "!!!
不要include cpp文件。
include没什么复杂的,不过是逻辑上的内容拷贝而已,你include cpp文件,相当于有两个文件中分别有一份类的函数的实现代码,那不出函数重定义才怪呢。


[解决办法]
#include "MyArray.cpp "
==》
#include "MyArray.h "
[解决办法]
呵呵,嗯,也不能把话往死里理解。
理论上cpp没啥不可include的,都是源文件,凭啥不能include?同样,.h也不见得都是可以include的。

但通常,我们习惯上是把定义性的东西(比如变量定义,函数定义)放在.cpp文件,而且声明性的东西(比如变量声明,宏定义,类型定义等)放在.h文件。——至少99.9的C++程序员是这么做的。
而且,我们常常需要在多个文件中包含同一个头文件,而比较少的一个头文件只被包含一次。

所以,cpp文件不是用来被包含的,而.h文件是用来被包含的。

热点排行