C++编写类模板声明和实现要注意的地方

一:

  一般情况下,C++编写代码时,类的声明和实现是由2个文件分开来写的。

  ".h"放的是类的声明,“.cpp”放的是类的实现,然后使用该类的时候,就把该类对应的“ .h ”引用上就OK的了。

  但是在类模板中这样就不行。

  (1)

  如下:

  Person.h的这个文件放Person类的声明

  #include <iostream>

  #include <string>

  using  namespace  std;

  template<class  T1,class  T2>

  class  Person

  {

  public:

    Person(T1  name,T2  age);

    void  showPerson();

    T1   m_Name;

    T2     m_Age;

  };

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

 

  Person.cpp这个就编写Person类的实现。代码如下:

  #include "Person.h"

  template<class  T1,class  T2>

  Person<T1,T2>::Person(T1  name,T2  age)

  {

    m_Name=name;

    m_Age=age;

  }

 

  template<class  T1,class  T2>

  void   Person<T1,T2>::showPerson()

  {

    cout<<"name: "<<this->m_Name<<endl;
    cout<<"age: "<<this->m_Age<<endl;

  }

 

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

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

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

  #include "Person.h"

  int     main()

  {  

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

    p.showPerson();     //②

    return   ;

  }

  也就是把#include "Person.h"改成  #include  "Person.cpp",但是不建议写成这样。

 

二:

  类模板一般就把声明和实现写进同一个文件,并把文件名改成“ .hpp ”,当我们看到这个后缀的时候,我们就这个文件是个模板类。

  上面的例子Person类,合进一个文件如下:

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

  

  #include <iostream>

  #include <string>

  using  namespace  std;

  template<class  T1,class  T2>

  class  Person

  {

  public:

    Person(T1  name,T2  age);

    void  showPerson();

    T1   m_Name;

    T2     m_Age;

  };

  template<class  T1,class  T2>

  Person<T1,T2>::Person(T1  name,T2  age)

  {

    m_Name=name;

    m_Age=age;

  }

 

  template<class  T1,class  T2>

  void   Person<T1,T2>::showPerson()

  {

    cout<<"name: "<<this->m_Name<<endl;
    cout<<"age: "<<this->m_Age<<endl;

  }

  然后把文件保存为   Person.hpp

 

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

  #include  "Person.hpp"

  int     main()

  {  

    Person<string ,int>  p("zhou",20);     // ①

    p.showPerson();     //②

    return   ;

  }

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

  C++编写类模板声明和实现要注意的地方

原文链接: https://www.cnblogs.com/Unclebigdata/p/14477353.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++编写类模板声明和实现要注意的地方

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/208556

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午11:27
下一篇 2023年2月12日 下午11:28

相关推荐