2016年9月21日 星期三

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

標籤: , ,

0 個意見:

張貼留言

訂閱 張貼留言 [Atom]

<< 首頁