求教一个关于链接的问题
本人在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文件是用来被包含的。