2010-02-19 4 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; 
} 

이 elgant 미만이지만, 내가 부족이이 일을 더 나은 방법이?

편집 : FWIW, 추가 매개 변수의 이유는 멀티 스레딩을 돕기 위해 문제의 개체에서 일부 상태 관련 구성원을 구체화하는 것입니다.

+0

입니다. 데이터 멤버가있는 경우 정의에 따라 상태 비 저장되지 않습니다. –

+0

공정한 점 Neil, text edited. –

답변

18

방법에 대해 :

class MyClass 
{ 
public: 
    CMyObject A,B; 

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

?

+0

감사합니다. Benoit, 나는 더 나은 방법이 있어야한다는 것을 알고있었습니다. 화면을 너무 오랫동안 응시합니다. –

+0

반갑습니다. C# 및 Java에서는 오버로드가 허용되지 않으므로이를 보상해야합니다. 그래서 나는 아무 것도 발명하지 않았다고 생각합니다 :-) –

+0

기본 매개 변수가 C# 및 Java에서 허용되지 않는다는 것을 의미합니다 - 그들은 확실히 과부하를 허용합니다 (기본 매개 변수는 C# 4.0에 있음) –

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)