C++ Follow Me(2): 類的產生(上):從封裝函數開始

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)對於一個調用者來說要輕鬆的多。

    上面是從重構的角度來得到類的。事實上,這個方法是在有了一些現成代碼情況下使用,而沒有代碼我們怎樣得到類了?下一講我將涉及這方面的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章