作者Caesar08 (Caesar)
看板C_and_CPP
標題Re: [問題] A類別的函式內 呼叫 A類別函式 出錯
時間Thu Jun 2 15:52:00 2016
class A;
這是
class declaration
template<class>class B;
這也是
class declaration
class C
{
int i;
public:
void test();
};
這是
class definition
其中void test()是
member function declaration
template<class T>
class D
{
T i;
public:
void test();
};
這也是
class definition
其中void test()也是
member function declaration
void C::test(){}
這是
member function definition
template<class T>
void D<T>::test(){}
這也是
member function definition
非class template的class(如A與C)
會將
member function的
declaration與
definition分開
declaration放在.h
definition放在.cpp
而class template的class(如B與D)
有2種做法(第3種是export,但把這東西忘了吧)
一種是把
member function的
declaration與
definition放在一起
例如
//.hpp or .hxx or anything but not .h
template<class T>
class E
{
T i;
public:
void test(){}
};
然後為了說明這不是一般的.h檔案,所以會把這檔案取成別的名字
常見的有
.hpp或
.hxx或乾脆沒有副檔名(如iostream)
所以這時候,就不需再有一個.cpp檔案了
另一種做法是按照傳統,把
member function的
declaration與
definition分開
但是在.h檔案(或.hpp或其他的)裡面include該
member function definition的檔案
例如
//.h
template<class T>
class F
{
T i;
public:
void test();
};
#include"your/member/function/definition/file.cpp"
//.cpp
template<class T>
void F<T>::test(){}
然而你的方法卻是include .cpp(然後裡面在include .h)
不是不能這麼做
只是當別人要用你的檔案時,他會以為只要include .h就好
然後就發現compile不過,之後才知道原來你用的方式跟別人不一樣
我以前都用第二種做法,但後來發現用第一種做法比較好
(用第二種容易讓別人搞混,以為compile時也要把.cpp放進去,結果就error了)
還有,你給的那連結,我看一眼就關掉了
連main function都寫不好的網誌,沒有看的必要
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.45.82
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1464853922.A.01E.html
推 hunandy14: 受益良多,一直想問這些問題,又不知道怎麼問 06/02 17:08
→ hunandy14: 我試著練習一下檔案在,差不多就是樣子嗎 06/02 17:08
差不多,但是別忘了include guard
→ hunandy14: 想再問的,我如果寫在同一個檔案 定義跟宣告 要分開嗎 06/02 17:12
如果你指的是member function,那通常不會再分開,因為很麻煩(需要多寫code)
但如果你指的是非member function,那這完全是看你要不要分開
(不過某些情況下,你不分開就過不了compile)
總結,要不要分開就是看你高興啦(除非有compile上的問題)
→ hunandy14: 你說[main function都寫不好] 具體是什麼意思呢想知道~ 06/02 17:15
你去查c++ main function該怎麼寫就知道了
http://lmgtfy.com/?q=c%2B%2B+main+function
→ hunandy14: 還有一個奇怪的問題XD 為什麼要把.h分開呢 直接引.cpp 06/02 17:16
→ bibo9901: 在同一個檔案裡可分可不分 看你的需要 06/02 17:22
→ bibo9901: 分開純粹是一個檔案太多行了不好看 #include其實就是 06/02 17:23
→ bibo9901: 複製貼上 和你寫在同一個檔案一樣意思 06/02 17:23
推 EdisonX: 受教了 推一個。 06/02 19:47
※ 編輯: Caesar08 (1.164.45.82), 06/02/2016 21:33:36