[問題] 介於static和private的宣告?

看板C_and_CPP (C/C++)作者 (麵T)時間10年前 (2015/12/28 23:29), 10年前編輯推噓3(3018)
留言21則, 5人參與, 最新討論串1/2 (看更多)
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

12/29 01:03, , 1F
member variable
12/29 01:03, 1F

12/29 10:42, , 2F
這應該問你,你當初為甚麼要宣告成static吧
12/29 10:42, 2F

12/29 12:20, , 3F
為什麼private對維護不好?
12/29 12:20, 3F

12/29 22:55, , 4F
為甚麼一定要宣告在函式內呢?
12/29 22:55, 4F

12/29 23:05, , 5F
因為那個變數從頭至尾只在該func使用,如果宣告在class成
12/29 23:05, 5F

12/29 23:05, , 6F
員中,那麼:1、必須在建構子初始化。2、原本可以寫成 co
12/29 23:05, 6F

12/29 23:05, , 7F
nst function 的函式,也要改成 nonconst
12/29 23:05, 7F

12/29 23:07, , 8F
而且,寫一般函式時,我們也不會把旗標寫成全域變數吧
12/29 23:07, 8F

12/29 23:17, , 9F
C++ 有個關鍵字叫 mutable 可以解決你的問題 2
12/29 23:17, 9F

12/29 23:19, , 10F
推樓上,直覺想到這個,但這應該不是他要的
12/29 23:19, 10F

12/29 23:20, , 11F
我看你的敘述,感覺不用static就可以達到這些
12/29 23:20, 11F

12/29 23:20, , 12F
但你用static,應該是第一次呼叫func的object才有這資料
12/29 23:20, 12F

12/29 23:21, , 13F
我會查看看的,謝謝
12/29 23:21, 13F

12/29 23:22, , 14F
在data member加一個pointer呢?
12/29 23:22, 14F

12/29& 23:23, , 15F
不懂「第一次呼叫func才有資料」
12/29& 23:23, 15F

12/29 23:26, , 16F
變數名不是叫firstcall嗎?
12/29 23:26, 16F

12/29 23:26, , 17F
應該會對第一次呼叫func的object給予某些資料吧
12/29 23:26, 17F
以上面舉例是這樣沒錯, 又其他範例: 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

12/30 00:05, , 18F
其他開發者,萬一在class中直接使用newvertex,而不是透
12/30 00:05, 18F

12/30 00:05, , 19F
過getnewvertex(),那他所計算的值就不保証是最新的座標
12/30 00:05, 19F

12/30 00:05, , 20F
位置了!但偏偏變數名稱有「new」
12/30 00:05, 20F

12/30 00:11, , 21F
也許是我自己太多慮,自找麻煩==
12/30 00:11, 21F
文章代碼(AID): #1MWLLZV_ (C_and_CPP)
文章代碼(AID): #1MWLLZV_ (C_and_CPP)