以下是將 class 的data member 基本上給外部用的,用 const
如果是 讀取,當然沒問題,
但是如果是設定新值, 就必需要用 set member function, 或 set template
如果 data member 繁多, 就用 set template 吧, 省得寫一大堆沒營養的 fuction.
這樣作的好處是 trace code 的時候, 可以很容易的找到 set value 的地方.
當然如果不這麼作,用眼看,也是分析的出來. 但是
讀取通常有數十個到數百個 reference, 設定通常是數個.
要在數百個中找到數個,也是很累人的.
------------------------------------
#include <iostream>
#include <wtypes.h>
using namespace std;
void Output(const char* szFormat, ...)
{
char szBuff[1024];
va_list arg;
va_start(arg, szFormat);
_vsnprintf(szBuff, sizeof(szBuff), szFormat, arg);
va_end(arg);
OutputDebugString(szBuff);
}
template <class T>
T & set(const T& vin) {
return (T&) vin;
}
class cOne {
public:
const int v;
// int v;
cOne() : v(0)
{}
void dump()
{
Output("cOne'v = %d\n",v);
}
};
void func_modify(int & var)
{
var++;
}
void set_test()
{
cOne c1;
c1.dump();
// c1.v = 7; // error
int v1 = c1.v;
// int &v2 = c1.v; // error
int &v3 = set(c1.v);
v3=4;
c1.dump();
set(c1.v) = 6; c1.dump();
// func_modify(c1.v); // error
func_modify(set(c1.v)); c1.dump();
cOne *pc1 = new cOne;
// pc1->v = 10; // error
// int& v4 = pc1->v; // error
int& v5 = set(pc1->v);
v5=11;
pc1->dump();
set(pc1->v) = 12; pc1->dump();
// func_modify(pc1->v); // error
func_modify(set(pc1->v)); pc1->dump();
delete pc1;
}
int main()
{
cout << "Hi set_test" << endl;
set_test();
// getchar();
}
--------------------
----- Output -----
cOne'v = 0
cOne'v = 4
cOne'v = 6
cOne'v = 7
cOne'v = 11
cOne'v = 12
cOne'v = 13
訂閱:
張貼留言 (Atom)
車 和 東 , 兩個 不喜歡的 簡體字 寫法
车 是 草書 形變, 很難 和 小孩 解釋 為什麼 長這樣(反正你就背), 反而 車 就 很形象. 东 是 草書 形變, 很難 和 小孩 解釋 為什麼 長這樣( 反正你就背), (古人觀察到 日出東方, 東 是 木頭 加 日 , 那個方向 是 東.
-
在 ~/.bash_rc 內加入以下 function 即可在新開的 terminal 中, 用 .. N 快速切換到祖先目錄. FYI: cd - 可以來回切換前後目錄. toN() # toN num default { test ${1} || retur...
-
### Installing Python 3.8 on Ubuntu 18.04 from Source ### $ sudo apt update $ sudo apt install build-essential zlib1g-dev libncurses5-dev li...
-
台灣 2025年 前3季行人 死亡數 比去年同期 增4% . 為宣傳政蹟, 搏版面, 過度強調 行人帝王條款 , 不知 很多人 都只聽 權利 , 而 忽略 馬路如虎口 , 身體是自己的 , 不要以身犯險 .
沒有留言:
張貼留言