社区
C++ 语言
帖子详情
为什么只能让类的声明和定义放在同一个文件中
Tomorrow0
2003-12-12 10:59:31
我把一个类的生命放在一个文件x.h中,而定义放在另一个文件x.cpp中
但是在main函数的文件编译是会出错,提示错误的OBJ文件啊什么乱七八糟一大堆
然后我只能把声明和定义都放在x.cpp里才正常……
...全文
92
30
打赏
收藏
为什么只能让类的声明和定义放在同一个文件中
我把一个类的生命放在一个文件x.h中,而定义放在另一个文件x.cpp中 但是在main函数的文件编译是会出错,提示错误的OBJ文件啊什么乱七八糟一大堆 然后我只能把声明和定义都放在x.cpp里才正常……
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
30 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Tomorrow0
2003-12-14
打赏
举报
回复
还是会出错啊,构造函数的声明和定义放倒一个文件里就没问题,分开放就不行了
vcforever
2003-12-13
打赏
举报
回复
可能你的这个程序中的其他地方包含了这个头文件,导致重复的原因!
lijun2044
2003-12-13
打赏
举报
回复
我用vs.net成功了!
lijun2044
2003-12-13
打赏
举报
回复
用vs.net 把!
他对C++标准支持达到98%
newegg2002
2003-12-13
打赏
举报
回复
是啊,一共是三个文件,两个源文件,一个头文件的
newegg2002
2003-12-13
打赏
举报
回复
对了,我是在XP下运行的,编译器是visual c++ 6.0
你试试了还有错误吗?
真怪啊
Tomorrow0
2003-12-13
打赏
举报
回复
你是分开放在两个文件里吗
Tomorrow0
2003-12-13
打赏
举报
回复
什么没有包含?
newegg2002
2003-12-13
打赏
举报
回复
没有啊,我粘下来,运行了一次,没那事啊,只出现了两个错误啊,一个是Desk.cpp中少包含了一个#include <iostream.h>
还有就是一个可能是作者在
int a 后少打了一个分号而已,
运行结果也如果所料,
如下:
a10
a10
a10
a10
a10
Press any key to continue
newegg2002
2003-12-13
打赏
举报
回复
不会吧,我一向是这样做的.类声明作一个头文件,而实现作为一个.cpp文件,还从来没这样过, 不会是误包含了.cpp的文件啊,
随便猜,
sharkhuang
2003-12-13
打赏
举报
回复
呵呵!你没有包含啊!
Tomorrow0
2003-12-13
打赏
举报
回复
早上装了VC6结果也一样,在Compile时没问题,Builder时就出错
Linking...
Tdate_main.obj : error LNK2001: unresolved external symbol "public: __thiscall Tdate::Tdate(int,int,int)" (??0Tdate@@QAE@HHH@Z)
Tomorrow0
2003-12-13
打赏
举报
回复
为什么我用这两个命令行方式的编译器别的都没问题,只有构造函数会出现这样的问题?
Tomorrow0
2003-12-13
打赏
举报
回复
我另外试了几个程序,结果都一样啊。你们用的是什么编译器?
我用Borland C++BUILDER COMMAND LINE TOOLS 5.5和Digital Mars C/C++ Compilers都一样会出错,就是构造函数会这样,别的就没关系
zhanzhiyuan
2003-12-12
打赏
举报
回复
放在另一个头文件中行呀,你肯定是没有包含它的头文件了
Tomorrow0
2003-12-12
打赏
举报
回复
肯定包含了头文件了
yang2pipi
2003-12-12
打赏
举报
回复
是不是没包含头文件
cpsoft
2003-12-12
打赏
举报
回复
我的系统Windows XP+vc.net2003
cpsoft
2003-12-12
打赏
举报
回复
我这里可以通过,你把xxx.obj删了重新编译看看,也许你的设置有问题!
layman2008
2003-12-12
打赏
举报
回复
不会吧
贴出来,看看吧
加载更多回复(10)
C++
中
模板
定义
与
声明
为什么必须
放在
同一个
文件
中
通常情况下,你会在.h
文件
中
声明
函数和
类
,而将它们的
定义
放置在一个单独的.cpp
文件
中
。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的
定义
,而不仅仅是它的
声明
。因此,最好的办法就是将模板的
声明
和
定义
都放置在
同一个
.h
文件
中
。这就是为什么所有的STL头
文件
都包含模板
定义
的原因。”[1]"标准要求编译器在实例化模板时必须在上下文
中
可以查看到其
定义
实体;
C++
类
模板的
声明
和
定义
为什么要
放在
同一个
文件
ps:模板是在需要的时候,才会去生成一个具体化的实例的,比如,你只要一个int型的实例,模板就只会给你生成一个int型的实例,模板本身是不会被执行的(也就是模板本身不产生汇编指令),是模板生成的具体化实例才产生指令(这个实例是隐藏的,我们是看不到的)1、C++编译器在编译代码时是以cpp为单位的,参与编译的只是.cpp
文件
,不会报错的原因,是因为它能在.h里面找到模板的
声明
。2、而模板的实现.cpp里面,虽然有模板的具体实现,但是没有谁在该.cpp里面使用一个模板函数,就不会生成一个具体化的实例。
C++
中
模板
定义
与
声明
为什么
放在
同一个
文件
中
首先明确的是: 对普通函数来说,
声明
放在
头
文件
中
,
定义
放在
源
文件
中
,其它的地方要使用该函数时,仅需要包含头
文件
即可,因为编译器编译时是以一个源
文件
作为单元编译的,当它遇到不在本
文件
中
定义
的函数时,若能够找到其
声明
,则会将此符号
放在
本编译单元的外部符号表
中
,链接的时候自然就可以找到该符号的
定义
了。 对于模板。先明确,模板函数是在编译器遇到使用模板的代码时才将模板函数实例化(之前只有函数的模板
定义
模板
声明
与
定义
要
放在
同一
文件
中
?
“通常情况下,你会在.h
文件
中
声明
函数和
类
,而将它们的
定义
放置在一个单独的.cpp
文件
中
。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的
定义
,而不仅仅是它的
声明
。因此,最好的办法就是将模板的
声明
和
定义
都放置在
同一个
.h
文件
中
。这就是为什么所有的STL头
文件
都包含模板
定义
的原因。”[1] "标准要求编译器在实例化模板时必须在上下文
中
可以查看到其
定义
...
类
声明
和
定义
放在
同一个
cpp内
这样做是不对的,会导致链接时报错。 这样做的初衷是:给用户暴露一个
类
,该
类
的某些功能分拆至若干体积较小的
类
,为了简化编码把大
类
和小
类
的实现均
放在
大
类
的cpp
中
,从而用户看不到这些小
类
。 做法:假设大
类
是 “A.h&quot;和&quot;A.cpp”,若干小
类
为a1、a2、a3;小
类
的
声明
要单独建一个头
文件
&quot;XXX_private.h&quot;
放在
里面,在A.cpp
中
引用该头
文件
并
定义
小
类
的实现。 ...
C++ 语言
65,189
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章