2010-02-19 88 views
13

我重構了大量的代碼,我必須爲大量函數添加額外的參數,這些函數將始終具有該對象成員的值。像非靜態成員作爲C++中的默認參數

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object); 
    // used to be void MyFunc(); 
}; 

現在的東西,其實我喜歡讀

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object = A); 
}; 

但我不能有一個默認的參數是一個非靜態成員。我已閱讀this similar question這表明這是不可能的,但我想知道是否有任何合理的解決方法。原因是95%的時間將使用默認參數,因此使用默認參數將極大地減少我必須更改的代碼量。我迄今爲止的最佳解決方案就是這樣的;

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(BOOL IsA = TRUE); 
}; 

void MyClass::MyFunc(BOOL IsA) 
{ 
    CMyObject &Object = A; 
    if (!IsA) 
     Object = &B; 
} 

這不是優雅,但有沒有更好的方式做到這一點,我錯過了?

編輯: FWIW,額外參數的原因是從相關對象的某些狀態相關成員的外部來幫助多線程。

+0

如果它有一個數據成員,根據定義它不是無狀態的。 – 2010-02-19 12:11:52

+0

公平點尼爾,文本編輯。 – 2010-02-19 12:34:46

回答

18

如何:

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc() 
    { 
    MyFunc(A); 
    } 
    void MyFunc(CMyObject &Object); 
}; 

+0

謝謝Benoit,我知道必須有更好的方法。盯着屏幕太長。 – 2010-02-19 12:28:28

+0

不客氣。請注意,C#和Java中不允許重載,這是補償的方式。所以我想我沒有發明任何東西:-) – 2010-02-19 14:40:09

+0

我認爲你的意思是默認參數在C#和Java中是不允許的 - 它們肯定允許超載(默認參數顯然是在C#4.0中) – 2010-02-19 15:18:58

4

的另一種方法:

class MyClass 
{ 
public: 
    MyObject A,B; 

    void MyFunc(MyObject MyClass::*myObject = &MyClass::A) { 
     MyObject& obj = *(this->*myObject); 
    } 
}; 

這使得甚至不可能在從另一個MyClass的實例的爲MyObject構件通過。您的三個有效選項調用MyFunc是.MyFunc().MyFunc(&MyClass::A).MyFunc(&MyClass::B)