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::Person(T1  name,T2  age)

    m_Name=name;

    m_Age=age;

  template

  void   Person::showPerson()

    cout<<"name: "<m_Name<     cout<<"age: "<m_Age<

  /*===================================*/

  然后在main函数所在的那个文件(main.cpp)使用Person这个类的时候,编写如下:

  也就是main.cpp的内容即下:

  #include "Person.h"

  int     main()

    Person  p("zhou",20);     // ①

    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("zhou",20);     // ①

    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::Person(T1  name,T2  age)

    m_Name=name;

    m_Age=age;

  template

  void   Person::showPerson()

    cout<<"name: "<m_Name<    cout<<"age: "<m_Age<

  然后把文件保存为   Person.hpp

  接着在main.cpp的文件更改如下:

  #include  "Person.hpp"

  int     main()

    Person  p("zhou",20);     // ①

    p.showPerson();     //②

    return   ;

  然后g++   main.cpp  -o  main,这样就可以编译通过的了。如下图,就是运行的结果:

C++