1. 程式人生 > >QT5學習::(轉)c++ get與set方法的巨集定義實現

QT5學習::(轉)c++ get與set方法的巨集定義實現

c++ get與set方法的巨集定義實現


轉自:https://blog.csdn.net/Scythe666/article/details/48846761


一、文章來由

專案中需要用到 get 和 set 方法,但是問題來了,因為是 c++ 的,並不像 java 的 eclipse 有自動生成 get 和 set 方法。如果手寫是可以,但是當屬性特別多的時候會非常麻煩。。。但是巨集定義方法可以搞定這個問題~~

二、具體程式碼

2.1 非指標型別成員變數

// PropertyBuilderByName 用於生成類的成員變數
// 並生成set和get方法
// type 為變數型別
// access_permission 為變數的訪問許可權(public, priavte, protected)

#define PropertyBuilderByName(type, name, access_permission)\
    access_permission:\
        type m_##name;\
    public:\
    inline void set##name(type v) {\
        m_##name = v;\
    }\
    inline type get##name() {\
        return m_##name;\
    }\

分析:

可以這樣寫的原因就是因為 #define 預處理,是在編譯器編譯之前執行的純字串替換,這裡的 ##name 會直接被替換成傳入的 name,所以該巨集生成成員變數 m_name 由 name 決定,其訪問許可權由 acess_permission 指定
另外:

`#define語句中的#是把引數字串化,##是連線兩個引數成為一個整體。

2.2 指標型別成員變數

同樣的道理:

#define PointerPropertyBuilderByName(type, name, access_permission)\
    access_permission:\
        type* m_##name;\
    public:\
        inline void set##name(type* v){\
            m_##name = v;\
        }\
        inline type* get##name(){\
            return m_##name;\
        }\


2.3 test

class Test 
{ 
PropertyBuilderByName(int, A, private) 
PointerPropertyBuilderByName(double, DBV, private) 
};

int main() 
{ 
Test t;

t.setA(10);
cout << "A = " << t.getA() << endl;

double a = 12.3445;
t.setDBV(&a);
cout << "DBV: " << *(t.getDBV()) << endl;

system("pause");
return 0;