关于.h文件和.cpp文件以及模板类的若干问题

时间:2020-12-19 19:55:11
问题1.
VC6 和 VC.net对模板的处理是不是存在一些缺陷?
比如有如下例子
//MyCls.h
template<class T>
class CMyCls
{
public:
  CMyCls();
  ~CMyCls();
public:
  T Fun();
};

//MyCls.cpp
#include"mycls.h"
template<class T>
CMyCls<T>::CMyCls(void)
{
}
template<class T>
CMyCls<T>::~CMyCls(void)
{
}
template<class T>
T CMyCls<T>::Fun(void)
{
  return 0;
}
Build时会出错"unresolved external symbol"
如果将.Cpp文件中的内容全部写到.h文件中,便不会出现问题,不知这是什么原因?是VC6及VC.net的规定?还是标准C++的规定?应当怎样做?

问题2.
.h文件与.cpp文件有什么细节上的区别?除了main函数一定要写在cpp中进行编译之外,比如将类的实现部分写在.h文件中有什么不妥吗?

7 个解决方案

#1


.h是头文件.
.cpp是程序文件.
头文件用来包含的..cpp文件是用来一起编译的.
不能对头文件进行编译.只能#include 的.
将类的实现部分写在.h之中当然不好.
因为这破坏了实现的封装.还有.包含时因为可能包含多个类实现的实例会出错.
当然你可以用#ifnodef  #def.之类的东西.
这是个习惯问题.将实现放在一个文件中,头文件提供接口!

第一个问题因为我没用过,我用G++ + VIM ,所以不知道!

#2


问题1
目前,对于模板,它的声明和实现必须放在一个文件中。虽有提出export的方法可以将它们分开放置,但目前编译器还不支持。
问题2
采用*.h,*.cpp形式,通常是将声明放在*.h中,将它的实现放在*.cpp中,这样便于管理,也条目清晰。你也可以将声明和实现都放在同一个文件中。

#3


不仅模板类,模板方法声明及定义也应该写到头文件中,因为模板类,模板方法并不生成具体的代码,它们只是告诉编译器如何生成代码,只有你在程序中将其实例化之后,编译器才会为其分配空间,生成代码,但是如果你的编译器支持export关键字的话,也可以将模板类声明及
方法分别放在.h及.cpp文件中

问题2就像Andy84920(你也不懂)所说的那样

#4


Andy84920(你也不懂)说得好
vc不支持export,vc.net也不支持,lippman对此解释是有歧义
不过你可以用#include "MyCls.cpp"
来完成模版在cpp里的实现

#5


将类的实现写在.h中不能很好的封装
采用*.h,*.cpp形式,还要有同样的名字,
另外建议你在用vc6.0和.net的时候,最好利用开发平台让它自行
生成框架

#6


对于michaelli,利用开发平台让他自行声称框架是什么意思?我好像在vc6 vc7中都没有看到有自动生成模板类的。
用.h和.cpp写的程序便以之后完全相同吗?是不是只是在维护上面.h更加合理一些?有的书上面说,将实现放在.cpp中是为了将类的实现隐藏起来,可是,这种隐藏是针对谁的?难道要针对自己隐藏自己代码吗?
另外我还有一个地方不是很清楚,virtual 的Destructor除了当使用指针或者引用调用的时候之外,还有没有什么特别的地方?

#7


对了,还有protected的constructor 和 destructor 与public的有什么区别吗?

#1


.h是头文件.
.cpp是程序文件.
头文件用来包含的..cpp文件是用来一起编译的.
不能对头文件进行编译.只能#include 的.
将类的实现部分写在.h之中当然不好.
因为这破坏了实现的封装.还有.包含时因为可能包含多个类实现的实例会出错.
当然你可以用#ifnodef  #def.之类的东西.
这是个习惯问题.将实现放在一个文件中,头文件提供接口!

第一个问题因为我没用过,我用G++ + VIM ,所以不知道!

#2


问题1
目前,对于模板,它的声明和实现必须放在一个文件中。虽有提出export的方法可以将它们分开放置,但目前编译器还不支持。
问题2
采用*.h,*.cpp形式,通常是将声明放在*.h中,将它的实现放在*.cpp中,这样便于管理,也条目清晰。你也可以将声明和实现都放在同一个文件中。

#3


不仅模板类,模板方法声明及定义也应该写到头文件中,因为模板类,模板方法并不生成具体的代码,它们只是告诉编译器如何生成代码,只有你在程序中将其实例化之后,编译器才会为其分配空间,生成代码,但是如果你的编译器支持export关键字的话,也可以将模板类声明及
方法分别放在.h及.cpp文件中

问题2就像Andy84920(你也不懂)所说的那样

#4


Andy84920(你也不懂)说得好
vc不支持export,vc.net也不支持,lippman对此解释是有歧义
不过你可以用#include "MyCls.cpp"
来完成模版在cpp里的实现

#5


将类的实现写在.h中不能很好的封装
采用*.h,*.cpp形式,还要有同样的名字,
另外建议你在用vc6.0和.net的时候,最好利用开发平台让它自行
生成框架

#6


对于michaelli,利用开发平台让他自行声称框架是什么意思?我好像在vc6 vc7中都没有看到有自动生成模板类的。
用.h和.cpp写的程序便以之后完全相同吗?是不是只是在维护上面.h更加合理一些?有的书上面说,将实现放在.cpp中是为了将类的实现隐藏起来,可是,这种隐藏是针对谁的?难道要针对自己隐藏自己代码吗?
另外我还有一个地方不是很清楚,virtual 的Destructor除了当使用指针或者引用调用的时候之外,还有没有什么特别的地方?

#7


对了,还有protected的constructor 和 destructor 与public的有什么区别吗?