C++编写类模板声明和实现要注意的地方
一:
一般情况下,C++编写代码时,类的声明和实现是由2个文件分开来写的。
".h"放的是类的声明,“.cpp”放的是类的实现,然后使用该类的时候,就把该类对应的“ .h ”引用上就OK的了。
但是在类模板中这样就不行。
(1)
如下:
Person.h的这个文件放Person类的声明
#include
#include
using namespace std;
template
class Person
public:
Person(T1 name,T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
/*===========================================*/
Person.cpp这个就编写Person类的实现。代码如下:
#include "Person.h"
template
Person
m_Name=name;
m_Age=age;
template
void Person
cout<<"name: "< /*===================================*/ 然后在main函数所在的那个文件(main.cpp)使用Person这个类的时候,编写如下: 也就是main.cpp的内容即下: #include "Person.h" int main() Person p.showPerson(); //② return ; 然后使用g++编译,g++ main.cpp -o main 这个时候链接就会报错的,在上面代码的① 和②这两个地方会报错。 (2) 为啥链接会报错的呢? 因为C++进行的是单元编译,在main.cpp里面对 p.showPerson()编译链接时,对 #include "Person.h" 这个文件查找,p.showPerson 属于类模板的成员方法,不会生成这样的代码,类模板的成员方法一开始不会创建,因为类型 不确定。 person.cpp虽然有实现的函数,但是成员函数并不会生成,导致链接的时候也不会找到的 所以类模板不建议分文件来编写。 总结:由于类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令。 /*==================================================*/ 但上面main.cpp的有个简单的更改方法。 #include "Person.cpp" int main() Person p.showPerson(); //② return ; 也就是把#include "Person.h"改成 #include "Person.cpp",但是不建议写成这样。 二: 类模板一般就把声明和实现写进同一个文件,并把文件名改成“ .hpp ”,当我们看到这个后缀的时候,我们就这个文件是个模板类。 上面的例子Person类,合进一个文件如下: /*========================================*/ #include #include using namespace std; template class Person public: Person(T1 name,T2 age); void showPerson(); T1 m_Name; T2 m_Age; }; template Person m_Name=name; m_Age=age; template void Person cout<<"name: "< 然后把文件保存为 Person.hpp 接着在main.cpp的文件更改如下: #include "Person.hpp" int main() Person p.showPerson(); //② return ; 然后g++ main.cpp -o main,这样就可以编译通过的了。如下图,就是运行的结果: