看板 C_and_CPP 關於我們 聯絡資訊
class objA{ public: void func(){ static bool firstcall=0; … } } 寫程式時, 旗標宣告成 static 很方便, 但是當他是放在類別函式裡面就怪怪的! 當我宣告兩個以上的類別 objA a1,a2; a1.func() a2.func() "static"會互相影響到 為了解決這問題只好把 firstcall 宣告成私有成員。 可是這樣對往後維護也不好… 請問有可以宣告在函式內, 卻又互相獨立的方法嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.14.8.80 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1451316579.A.7FF.html
longlongint: member variable 12/29 01:03
Caesar08: 這應該問你,你當初為甚麼要宣告成static吧 12/29 10:42
CaptainH: 為什麼private對維護不好? 12/29 12:20
Caesar08: 為甚麼一定要宣告在函式內呢? 12/29 22:55
noodleT: 因為那個變數從頭至尾只在該func使用,如果宣告在class成 12/29 23:05
noodleT: 員中,那麼:1、必須在建構子初始化。2、原本可以寫成 co 12/29 23:05
noodleT: nst function 的函式,也要改成 nonconst 12/29 23:05
noodleT: 而且,寫一般函式時,我們也不會把旗標寫成全域變數吧 12/29 23:07
LPH66: C++ 有個關鍵字叫 mutable 可以解決你的問題 2 12/29 23:17
Caesar08: 推樓上,直覺想到這個,但這應該不是他要的 12/29 23:19
Caesar08: 我看你的敘述,感覺不用static就可以達到這些 12/29 23:20
Caesar08: 但你用static,應該是第一次呼叫func的object才有這資料 12/29 23:20
noodleT: 我會查看看的,謝謝 12/29 23:21
Caesar08: 在data member加一個pointer呢?12/29 23:22
noodleT: 不懂「第一次呼叫func才有資料」12/29& 23:23
Caesar08: 變數名不是叫firstcall嗎?12/29 23:26
Caesar08: 應該會對第一次呼叫func的object給予某些資料吧12/29 23:26
以上面舉例是這樣沒錯, 又其他範例: class objB{ //變換矩陣 double transform[16]; //上一次的矩陣值 double preTranform[16]; //原始座標 double vertex[3n]; //新座標 double newVertex[3n]; // void multi(double *matrx) { 將變換矩陣乘上 matrx } double* GetNewVertex() { 如果變換矩陣值沒變 (等於preTransform), 回傳newVertex; 否則重算並回傳newVertex } } 像上面這種情況, preTransform 和 newVertex 也是只在一個func中使用, 而且原本成員就有類似的名稱 transform 和 vertex ※ 編輯: noodleT (27.242.128.158), 12/29/2015 23:57:41
noodleT: 其他開發者,萬一在class中直接使用newvertex,而不是透 12/30 00:05
noodleT: 過getnewvertex(),那他所計算的值就不保証是最新的座標 12/30 00:05
noodleT: 位置了!但偏偏變數名稱有「new」 12/30 00:05
noodleT: 也許是我自己太多慮,自找麻煩== 12/30 00:11