c++ set/get data member 用 set() template 區分出來
以下是將 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
如果是 讀取,當然沒問題,
但是如果是設定新值, 就必需要用 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
0 個意見:
張貼留言
訂閱 張貼留言 [Atom]
<< 首頁