C++ Follow Me(2): 類的產生(上):從封裝函數開始
黃國強 2006-11-29
C++ Follow Me(1)中對面向對象的必要性作了一些敘述,如果C程序員應該怎樣才能成長爲一個C++程序員呢?我這裏就介紹一個方法可供有興趣的朋友參考。
比如,我現有一個用C寫的複雜函數。首先它有很多函數參數,而且函數內部存在很多局部變量。現在我們對他進行重構。下面爲例子代碼。
int func(int param1,bool param2,double param3,float param4)
{
int temp1,temp2;
......
return temp2;
}
void main(void)
{
......
int n = func(param1,param2,param3,param4);
......
}
具體步驟如下:
1 首先創建一個類,將這個函數移入該類。
上面的代碼就變成下面這樣。是不是已經有點像C++的程序了。
class CWrappedFunc
{
......
public:
int func(int param1,bool param2,double param3,float param4)
{
int temp1,temp2;
......
return temp2;
}
......
};
void main(void)
{
......
CWrappedFunc aFunc;
int n = aFunc.func(param1,param2,param3,param4);
}
2 將所有函數參數變成類的成員。
代碼將變成這個樣子。
class CWrappedFunc
{
......
public:
void SetParam1(int param1){m_param1 = param1;}
// 其他SetParam省略
int func()
{
int temp1,temp2;
......
return temp2;
}
......
private:
int m_param1;
bool m_param2;
double m_param3;
float m_param4;
};
void main(void)
{
......
CWrappedFunc aFunc;
aFunc.SetParam1(param1);
......
int n = aFunc.func();
}
3 將所有局部變量變成類的成員。
代碼將變成這個樣子。
class CWrappedFunc
{
......
public:
void SetParam1(int param1){m_param1 = param1;}
// 其他SetParam省略
int func()
{
......
return temp2;
}
......
private:
int m_param1;
bool m_param2;
double m_param3;
float m_param4;
int temp1,temp2;
};
以上工作做完了,我們對這個函數的工作就告一段落了。表面上我們除了得到了一個類之外,沒有其他收穫。事實上C++的價值往往只有隨着時間的推移,項目的不斷演進才能體現出來。
上面封裝的代碼我認爲至少有以下幾個優點。
* 對我們傳入的參數有了保存,便於main()中後續應用的使用;
* 局部變量的保存,後續應用同樣也可能用到;
* 使用func()比使用func(param1,param2,param3,param4)對於一個調用者來說要輕鬆的多。
上面是從重構的角度來得到類的。事實上,這個方法是在有了一些現成代碼情況下使用,而沒有代碼我們怎樣得到類了?下一講我將涉及這方面的問題。