C 編寫類模板宣告和實現要注意的地方

2022-06-13 05:15:08 字數 2172 閱讀 8304

一:

一般情況下,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<

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

#include "person.h"

int     main()

personp("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()

personp("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<

接著在main.cpp的檔案更改如下:

#include  "person.hpp"

int     main()

personp("zhou",20);     // ①

p.showperson();     //②

return   ;

然後g++   main.cpp  -o  main,這樣就可以編譯通過的了。如下圖,就是執行的結果:

C 類模板的宣告和實現不能分離

也許你具有良好的程式設計習慣,在定義乙個類的時候總會把宣告和實現分離開,位於不同的檔案中。比如你定義乙個類a,首先建立乙個.h檔案,如下 class a 接下來你建立乙個.cpp檔案實現類的宣告,如下 include classa.h include a a int b void a show a ...

C 模板類宣告和實現遇到的問題

宣告乙個 模板類的標頭檔案 stack.h include include templateclass stack 另外宣告乙個模板類的實現檔案 stack.cpp include stack.h templatevoid stack push t const elem templatevoid s...

C 模板類的宣告

c 的模板類感覺跟c 的泛型非常相似,自己寫了個例子試試,結果一大堆錯誤,後來慢慢除錯,發現模板類的宣告和定義不能分開 必須在同乙個檔案中 否則在使用模板類的會報乙個錯誤 無法解析的外部符號.該符號在函式 main 中被引用 然後把函式的定義全部挪到類的宣告裡面去後,就可以了通過了。看了好多人的例子...