精華區beta C_and_CPP 關於我們 聯絡資訊
若是這樣寫 compiler會過 但是要是你有呼叫 Value 這個函式的話 VC 2005就會顯示compiler error link1120, 無法解析的外部符號 a.h class TreeNode { private: public: NodeVector * Children; TreeNode * Parent; int Item; bool ItemIsIntra; int ItemsetNumber; int Support; TreeNode( int anItem = -1, bool ItemIsIntra = false, int Sup = 0, TreeNode * aParent = NULL ); inline TreeNode * FindChild( TreeNode * Child ); inline void Value( int anItem , bool xx , int Sup , TreeNode * aParent ); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ~TreeNode(); }; a.c inline void TreeNode::Value( int anItem, bool xx, int Sup, TreeNode * aParent ){ Children = NULL; Parent = aParent; ItemsetNumber = 0; Item = anItem; ItemIsIntra = xx; Support = Sup; } 若是把inline拿掉就沒問題了, 請問為什麼不能inline呢, 她只是給值而已, 為什麼一 inline就錯誤呢 研究了一天 還是不得其解 只好PO上來問問大家 > < 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.134.26.131
layan:hi, 這是語法的問題 04/13 16:37
layan:若你要inline一個 func, 你應該要把 inline implementation 04/13 16:38
layan:放在 .h 裡, 也就是把你的 a.c 裡的那個 implementation 04/13 16:38
layan:放在 a.h 裡, 這樣就 OK 了 04/13 16:39
QQ29:可是我用簡單的寫法試著他這樣實作宣告分開 也沒事耶我用VC8 04/13 16:42
layan:To QQ29, 這樣本來就可以過阿, 只是你在別的.cpp 要 call 04/13 16:46
layan:該 func 時, linker 會跟你說它找不到它的 implemntation. 04/13 16:46
layan:其實這樣的寫法大多用在 private member function. 04/13 16:47
QQ29:真的耶 分開在不同檔案 就不行了 謝謝你 04/13 16:49
zesiva:請問那是因為是class裡面的func才有這種限制嗎 04/13 16:56
zesiva:若不在class裡面的func要inline也要定義在.h嗎 謝謝 04/13 16:56
QQ29:請教一下 為什麼你沒去呼叫他就沒事 呼叫了才說 無法解晰的 04/13 17:05
QQ29:外部符號呢? 可以講一下原理嘛@@ 04/13 17:06
> -------------------------------------------------------------------------- < 作者: littleshan (我要加入劍道社!) 看板: C_and_CPP 標題: Re: [問題] 關於inline與class的問題 時間: Mon Apr 13 19:01:48 2009 ※ 引述《zesiva (呼拉拉)》之銘言:
zesiva:請問那是因為是class裡面的func才有這種限制嗎 04/13 16:56
zesiva:若不在class裡面的func要inline也要定義在.h嗎 謝謝 04/13 16:56
是的。 請回想一下 inline 的作用:在呼叫端直接展開 function 的內容。 inline int f(int i) { return i+1; } int XXX() { int x = 10; int y = f(x); // compiler 在這邊把 f(x) 直接代換成 x+1 } 你可以想像一下,如果 .h 中沒有 f() 的內容 { return i+1; } 那呼叫 f(x) 的時候,compiler 要把它代換成什麼? 推 QQ29:請教一下 為什麼你沒去呼叫他就沒事 呼叫了才說 無法解晰的 04/13 17:05
QQ29:外部符號呢? 可以講一下原理嘛@@ 04/13 17:06
因為沒有呼叫時,compiler 就不會產生對應的 assembly code, 因此編譯出來的 object file 中並不會參照到這個實際上沒定義的 symbol, 這樣的 object file 可以順利連結執行,linker 也不需要報錯。 建議去找一些 assembler/linker 如何運作的相關資料,會了解比較透澈 (如 computer organization 的書) 這種「呼叫才會報錯」的現像可以引出一些小技巧,比如說 class T { public: explicit T(int i) : data(i) {} private: T(); // default ctor,宣告但不定義 T(const T&); // copy ctor,同樣宣告但不定義 T& operator=(const T&); // 同上,宣告但不定義 int i; }; 這個 class 這樣寫的目的在於要求使用者一定要用 int 作為參數來建 構 T,而不能使用 default 或 copy constructor。同時它也禁止使用 者用等號來直接複製物件。需要注意的是,如果我們不寫 default/copy constructor 或 operator=,compiler 會自動幫我們生一個出來,而不 知情的使用者將會用得很愉快。為了避免這種情況,我們把它宣告在 private 區域中。 然而如果我們同時又提供了這些 function 的定義,那麼在 T 的 friend 或是 public derived class 中又可以順利呼叫這些 function。因此這 邊的作法是提供宣告但不給定義,若它們被其它 function 呼叫時,linker 就會顯示錯誤訊息。