作者noodleT (面T)
看板C_and_CPP
标题[问题] 介於static和private的宣告?
时间Mon Dec 28 23:29:36 2015
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1451316579.A.7FF.html
1F:→ longlongint: member variable 12/29 01:03
2F:→ Caesar08: 这应该问你,你当初为甚麽要宣告成static吧 12/29 10:42
3F:推 CaptainH: 为什麽private对维护不好? 12/29 12:20
4F:→ Caesar08: 为甚麽一定要宣告在函式内呢? 12/29 22:55
5F:→ noodleT: 因为那个变数从头至尾只在该func使用,如果宣告在class成 12/29 23:05
6F:→ noodleT: 员中,那麽:1、必须在建构子初始化。2、原本可以写成 co 12/29 23:05
7F:→ noodleT: nst function 的函式,也要改成 nonconst 12/29 23:05
8F:→ noodleT: 而且,写一般函式时,我们也不会把旗标写成全域变数吧 12/29 23:07
9F:推 LPH66: C++ 有个关键字叫 mutable 可以解决你的问题 2 12/29 23:17
10F:推 Caesar08: 推楼上,直觉想到这个,但这应该不是他要的 12/29 23:19
11F:→ Caesar08: 我看你的叙述,感觉不用static就可以达到这些 12/29 23:20
12F:→ Caesar08: 但你用static,应该是第一次呼叫func的object才有这资料 12/29 23:20
13F:→ noodleT: 我会查看看的,谢谢 12/29 23:21
14F:→ Caesar08: 在data member加一个pointer呢?12/29 23:22
15F:→ noodleT: 不懂「第一次呼叫func才有资料」12/29& 23:23
16F:→ Caesar08: 变数名不是叫firstcall吗?12/29 23:26
17F:→ 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
18F:→ noodleT: 其他开发者,万一在class中直接使用newvertex,而不是透 12/30 00:05
19F:→ noodleT: 过getnewvertex(),那他所计算的值就不保证是最新的座标 12/30 00:05
20F:→ noodleT: 位置了!但偏偏变数名称有「new」 12/30 00:05
21F:→ noodleT: 也许是我自己太多虑,自找麻烦== 12/30 00:11