C++为啥要求把类声明和类实现进行分离又为啥要求模板类的类声明和类实现要都放在头文件而不能分离?( 二 )
例2(定义与实现不分离,正确的示范)// CTest.htemplate \u0026lt;class T\u0026gt; class CTest{public: T\u0026amp; get_value(); void set_value(const T\u0026amp; _value);protected: T m_value;};template \u0026lt;class T\u0026gt;T\u0026amp; CTest\u0026lt;T\u0026gt;::get_value(){ return m_value;}template \u0026lt;class T\u0026gt;void CTest\u0026lt;T\u0026gt;::set_value(const T\u0026amp; _value){ m_value = https://www.zhihu.com/api/v4/questions/270627626/_value;} // main.cpp#include "CTest.h"int main () { CTest\u0026lt;int\u0026gt; t; t.set_value(2); return 0;} 此时执行 g++ -o main main.cpp CTest.h便不会再报错。
例3(定义与实现分离,但是在实现所在文件中添加实例化声明)// CTest.htemplate \u0026lt;class T\u0026gt;class CTest{public: T\u0026amp; get_value(); void set_value(const T\u0026amp; _value);protected: T m_value;};// CTest.cpp#include "CTest.h"template \u0026lt;class T\u0026gt;T\u0026amp; CTest\u0026lt;T\u0026gt;::get_value(){ return m_value;} template \u0026lt;class T\u0026gt;void CTest\u0026lt;T\u0026gt;::set_value(const T\u0026amp; _value){ m_value = https://www.zhihu.com/api/v4/questions/270627626/_value;}template class CTest/u0026lt;int/u0026gt;; // 实例化声明 // main.cpp#include "CTest.h"int main () { CTest\u0026lt;int\u0026gt; t; t.set_value(2); return 0;} 此时执行 g++ -o main main.cpp CTest.h 便不会再报错。与例1的差别仅仅是在test.cpp后面添加了一行实例化声明,执行g++ -o main main.cpp CTest.h CTest.cpp 不报错。由于CTest.cpp中添加了实例化声明,因此编译器在编译CTest.cpp时,会在CTest.obj加入对应实现体的二进制代码(因为此时T已知)。所以在链接时,链接器可以找到该模板类的具体实现。
■网友
首先类声明和类实现分离是为了隐藏实现。比如你要是写了一个类,但类的具体实现代码你不想别人看到,你就用这种方法:对写了类实现的cpp文件编译,然后将头文件和编译好的lib给别人即可。头文件的存在只是告诉对方编译器我这个lib有什么什么symbol(当然不一定是全部的,你可以不公布,但是对方反编译就可找得到)
而模板为什么不能写在cpp文件里呢?因为cpp文件是C++的编译单元。各个cpp文件在编译时是不相干的,只有在link时才会在各个cpp的中间产物obj文件里把各个未决的symbol给找到并连接好形成可执行文件。然而模板都是要特化的,通过编译时常量进行特化;这个过程发生在编译时,如果你把模板写在某个cpp文件里,另外一个cpp是根本就不知道这个模板的具体实现的,尽管他看得到声明,可是他找不到实现啊。什么?你说跑到别的cpp里找?对不起这是linker的工作,编译器是做不到的
■网友
因为c++编译完后的目标文件中源代码的元信息太少,所以不得不保留头文件形式。
■网友
可以分离的。 只不过要求你自己在模板定义可见的地方显示实例化(一般是cpp里)。
推荐阅读
- 禄口■南京禄口国际机场要求成都旅客“原路返回”?机场回应
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- 为啥到现在你还没有女朋友 ?
