[問題] class中的static

看板C_and_CPP作者 (今天開始是魔王)時間15年前 (2010/08/02 06:04), 編輯推噓2(2018)
留言20則, 4人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 是這樣的~有一個class長這樣 class YourClass { public: YourClass(int data); YourClass(); void set (int data); int get(); static int calculate(); private: int data; static int sum; }; 其中static int calculate()會修改static int sum的值並回傳結果 int YourClass::calculate() { sum = 100; return sum; } 不過再編譯會出現 class.cpp:(.text+0x8a): undefined reference to `YourClass::sum' class.cpp:(.text+0x96): undefined reference to `YourClass::sum' collect2: ld returned 1 exit status 請問這種錯誤的原因和要如何解決? 補充說明: 平台是 x86_64-suse-linux gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux) 語言 C++ 請各位幫幫我~感恩 -- 達克女王黑爾芭終於舉兵, 留斯之王亞培隆起而呼應之, 兩者皆望見彩紅一端,並聯手抵禦可憎之「波」。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.126.16.177

08/02 14:10, , 1F
static變數的宣告有問題
08/02 14:10, 1F

08/02 14:12, , 2F
在class外面加一行 int YourClass::sum;
08/02 14:12, 2F

08/02 14:13, , 3F
如果需要給sum初值可以在那邊一起給:)
08/02 14:13, 3F

08/02 14:16, , 4F
理由可以參考看看這篇 #171lx1sv
08/02 14:16, 4F

08/02 14:22, , 5F
static int sum = 0;
08/02 14:22, 5F

08/02 14:24, , 6F
感謝回答 我多加int YourClass::sum;的確就沒有錯誤了
08/02 14:24, 6F

08/02 14:25, , 7F
不過我還想之道理由 #171lx1sv這篇在我發問之前已經看了
08/02 14:25, 7F

08/02 14:27, , 8F
回pico2k 這個我已經試過了ISO C++ forbids in-class in
08/02 14:27, 8F

08/02 14:28, , 9F
itialization of non-const static member ‘sum’
08/02 14:28, 9F

08/02 14:32, , 10F
static class data member簡單的想成是跨所有同樣這個
08/02 14:32, 10F

08/02 14:32, , 11F
class instances的glabal variable, 它所存在的記憶體空
08/02 14:32, 11F

08/02 14:33, , 12F
間不在instance佔用的空間內, 所以你需要另外"定義"這個
08/02 14:33, 12F

08/02 14:34, , 13F
變數出來, 寫在class內的那行只是"宣告"; 就好像你可以
08/02 14:34, 13F

08/02 14:34, , 14F
在很多.c/.cpp裡用extern來宣告global變數, 但你必須找
08/02 14:34, 14F

08/02 14:35, , 15F
一個.c/.cpp確實放了該變數的定義, linker才找得到大家
08/02 14:35, 15F

08/02 14:35, , 16F
都宣告的那個變數, 真正的位址是在哪裡. 以上是小弟的認
08/02 14:35, 16F

08/02 14:36, , 17F
知, 簡單的說就是語言規則如此; 若是有漏誤的地方還麻煩
08/02 14:36, 17F

08/02 14:36, , 18F
板上其他大大指正....<(_ _)>
08/02 14:36, 18F

08/02 14:38, , 19F
感謝V大的解答 我之前一直以為在class內宣告static
08/02 14:38, 19F

08/02 14:39, , 20F
member就可以使用 class::member了 囧~
08/02 14:39, 20F
文章代碼(AID): #1CLc01qp (C_and_CPP)