为什么只能让类的声明和定义放在同一个文件中

时间:2022-02-09 10:00:40
我把一个类的生命放在一个文件x.h中,而定义放在另一个文件x.cpp中
但是在main函数的文件编译是会出错,提示错误的OBJ文件啊什么乱七八糟一大堆
然后我只能把声明和定义都放在x.cpp里才正常……

30 个解决方案

#1


不会吧

贴出来,看看吧

#2


是不是没包含头文件

#3


肯定包含了头文件了

#4


放在另一个头文件中行呀,你肯定是没有包含它的头文件了

#5


用了模板吧,vc6你只能把定义和实现都写在头文件中

#6


应该是没有包含头文件吧
  不可能啊

#7


除了摸板而外,这种情况不可能发生的!!

#8


恩,我估计也是头文件包含的错误,你可以先写个简单的程序,把头文件包含搞清楚:

比如,我有三个文件: main.cpp,  CStudent.h, CStudent.cpp

main.cpp 是程序主函数,CStudent.h & CStudent.cpp 分别是类的定义和实现文件。


//--main.cpp----------------------------------------//
#include "CStudent.h"


void main()
{
CStudent A;

A.InputInfo("windz", 22);

A.ShowInfo();

}



//--CStudent.h-----------------------------------------------------------//

class CStudent
{
public:
void InputInfo(char *pname, int nAge);
void ShowInfo();

private:
char name[18];
int  age;
};



//--CStudent.cpp-----------------------------------------------------------//
#include <iostream.h>
#include <string.h>
#include "CStudent.h"


void CStudent::InputInfo(char *pname, int nAge)
{
strcpy(name, pname);
age = nAge;
}

void CStudent::ShowInfo()
{
cout<<name<<"\n";
cout<<age<<endl;
}



#9


奇怪,现在又可以了

#10


又有新的问题了,如果以分开存放的方式,若有构造函数的话就会出错,提示为:
Unresolved external "x:x()" referenced from X:\xxx.obj

#11


难道一个类的构造函数的定义一定要和声明放在同一个文件中吗?

#12


Unresolved external "x:x()" referenced from X:\xxx.obj

出现这种问题的一种可能是你在CPP文件里面是这样写的:
x()
{}

而没有这样写:
x:x()
{}

猜测而已

#13


//Dest.h
class Desk
{
public:
Desk();
protected:
                  int a
};

//Desk.cpp
#include "Desk.h"
Desk::Desk()
{
         a=10;
cout<<"a"<<a<<endl;
}

//Deskmain.cpp
#include <iostream.h>
#include "Desk.h"
void fn()
{
Desk d[5];
}

void main()
{
fn();
}

#14


第一行应该是//Desk.h,笔误

#15


我这里可以通过,你把xxx.obj删了重新编译看看,也许你的设置有问题!

#16


我的系统Windows XP+vc.net2003

#17


可能你的这个程序中的其他地方包含了这个头文件,导致重复的原因!

#18


我另外试了几个程序,结果都一样啊。你们用的是什么编译器?
我用Borland C++BUILDER COMMAND LINE TOOLS 5.5和Digital Mars C/C++ Compilers都一样会出错,就是构造函数会这样,别的就没关系

#19


为什么我用这两个命令行方式的编译器别的都没问题,只有构造函数会出现这样的问题?

#20


早上装了VC6结果也一样,在Compile时没问题,Builder时就出错
Linking...
Tdate_main.obj : error LNK2001: unresolved external symbol "public: __thiscall Tdate::Tdate(int,int,int)" (??0Tdate@@QAE@HHH@Z)

#21


呵呵!你没有包含啊!

#22


不会吧,我一向是这样做的.类声明作一个头文件,而实现作为一个.cpp文件,还从来没这样过, 不会是误包含了.cpp的文件啊,

随便猜,

#23


没有啊,我粘下来,运行了一次,没那事啊,只出现了两个错误啊,一个是Desk.cpp中少包含了一个#include <iostream.h>
还有就是一个可能是作者在
int a  后少打了一个分号而已,
运行结果也如果所料,
如下:
a10
a10
a10
a10
a10
Press any key to continue

#24


什么没有包含?

#25


你是分开放在两个文件里吗

#26


对了,我是在XP下运行的,编译器是visual c++ 6.0

你试试了还有错误吗?
真怪啊

#27


是啊,一共是三个文件,两个源文件,一个头文件的

#28


用vs.net 把!
他对C++标准支持达到98%

#29


我用vs.net成功了!

#30


还是会出错啊,构造函数的声明和定义放倒一个文件里就没问题,分开放就不行了

#1


不会吧

贴出来,看看吧

#2


是不是没包含头文件

#3


肯定包含了头文件了

#4


放在另一个头文件中行呀,你肯定是没有包含它的头文件了

#5


用了模板吧,vc6你只能把定义和实现都写在头文件中

#6


应该是没有包含头文件吧
  不可能啊

#7


除了摸板而外,这种情况不可能发生的!!

#8


恩,我估计也是头文件包含的错误,你可以先写个简单的程序,把头文件包含搞清楚:

比如,我有三个文件: main.cpp,  CStudent.h, CStudent.cpp

main.cpp 是程序主函数,CStudent.h & CStudent.cpp 分别是类的定义和实现文件。


//--main.cpp----------------------------------------//
#include "CStudent.h"


void main()
{
CStudent A;

A.InputInfo("windz", 22);

A.ShowInfo();

}



//--CStudent.h-----------------------------------------------------------//

class CStudent
{
public:
void InputInfo(char *pname, int nAge);
void ShowInfo();

private:
char name[18];
int  age;
};



//--CStudent.cpp-----------------------------------------------------------//
#include <iostream.h>
#include <string.h>
#include "CStudent.h"


void CStudent::InputInfo(char *pname, int nAge)
{
strcpy(name, pname);
age = nAge;
}

void CStudent::ShowInfo()
{
cout<<name<<"\n";
cout<<age<<endl;
}



#9


奇怪,现在又可以了

#10


又有新的问题了,如果以分开存放的方式,若有构造函数的话就会出错,提示为:
Unresolved external "x:x()" referenced from X:\xxx.obj

#11


难道一个类的构造函数的定义一定要和声明放在同一个文件中吗?

#12


Unresolved external "x:x()" referenced from X:\xxx.obj

出现这种问题的一种可能是你在CPP文件里面是这样写的:
x()
{}

而没有这样写:
x:x()
{}

猜测而已

#13


//Dest.h
class Desk
{
public:
Desk();
protected:
                  int a
};

//Desk.cpp
#include "Desk.h"
Desk::Desk()
{
         a=10;
cout<<"a"<<a<<endl;
}

//Deskmain.cpp
#include <iostream.h>
#include "Desk.h"
void fn()
{
Desk d[5];
}

void main()
{
fn();
}

#14


第一行应该是//Desk.h,笔误

#15


我这里可以通过,你把xxx.obj删了重新编译看看,也许你的设置有问题!

#16


我的系统Windows XP+vc.net2003

#17


可能你的这个程序中的其他地方包含了这个头文件,导致重复的原因!

#18


我另外试了几个程序,结果都一样啊。你们用的是什么编译器?
我用Borland C++BUILDER COMMAND LINE TOOLS 5.5和Digital Mars C/C++ Compilers都一样会出错,就是构造函数会这样,别的就没关系

#19


为什么我用这两个命令行方式的编译器别的都没问题,只有构造函数会出现这样的问题?

#20


早上装了VC6结果也一样,在Compile时没问题,Builder时就出错
Linking...
Tdate_main.obj : error LNK2001: unresolved external symbol "public: __thiscall Tdate::Tdate(int,int,int)" (??0Tdate@@QAE@HHH@Z)

#21


呵呵!你没有包含啊!

#22


不会吧,我一向是这样做的.类声明作一个头文件,而实现作为一个.cpp文件,还从来没这样过, 不会是误包含了.cpp的文件啊,

随便猜,

#23


没有啊,我粘下来,运行了一次,没那事啊,只出现了两个错误啊,一个是Desk.cpp中少包含了一个#include <iostream.h>
还有就是一个可能是作者在
int a  后少打了一个分号而已,
运行结果也如果所料,
如下:
a10
a10
a10
a10
a10
Press any key to continue

#24


什么没有包含?

#25


你是分开放在两个文件里吗

#26


对了,我是在XP下运行的,编译器是visual c++ 6.0

你试试了还有错误吗?
真怪啊

#27


是啊,一共是三个文件,两个源文件,一个头文件的

#28


用vs.net 把!
他对C++标准支持达到98%

#29


我用vs.net成功了!

#30


还是会出错啊,构造函数的声明和定义放倒一个文件里就没问题,分开放就不行了