2017-03-09 964 views
0

다른 함수 (function1 및 function2)가있는 헤더 파일에서 동일한 기본 인수를 공유하는 가장 좋은 방법은 무엇입니까?모범 사례 C++ : 여러 메서드에 대한 기본 인수를 다시 사용하십시오.

#define PARAM1 = 48 
#define PARAM2 = getStuff(99) 

같은 것을 사용

class MyClass { 
    public: 
     virtual ... function1(..., int param1 = 48, int param2 = getStuff(99)) = 0; 
     virtual ... function2(..., int param1 = 48, int param2 = getStuff(99)) = 0; 
} 

오히려 불편 보인다. 나는 C++에 상당히 익숙하지 않기 때문에이 경우 가장 좋은 방법이 무엇인지 모르겠습니다. 대신 MyClass 내부에 개인 상수를 만들어야합니까?

+0

..., 난 그냥 대안을 보여주는거야 잘못되었거나 불량 상태입니다 말하는 게 아니에요? – felix

+0

정의를 사용하는 데는 아무런 문제가 없습니다. 정의를 의미있는 이름으로 지정하면됩니다. 예 : NUMBER_OF_SECONDS_IN_A_DAY. – wmc

+0

에 대한 멤버 vars : 합리적인 접근 방식처럼 보이지만, 나는 또한 반환 값을 저장하고 싶지 않지만 함수가 호출 될 때마다 호출하고 싶은 일부 함수에 의해 설정된 기본 인수가 있습니다. – juq

답변

1

당신은 할 수 있습니다

class MyClass { 
public: 
    void function1(int param1 = default_param1, int param2 = default_param2()); 
    void function2(int param1 = default_param1, int param2 = default_param2()); 

private: 
    static const int default_param1 = 48; 
    static int default_param2() { return getStuff(99); } // assuming it might change 
}; 
1

나는 당신의 기능을 가상 있습니다 참조 - 기본 매개 변수가 상속되지 않도록주의!

int getStuff(int n) 
{ 
    return n; 
} 

class MyClass 
{ 
public: 
    static constexpr int DefaultParam1 = 48; 
    static constexpr int DefaultParam2 = 99; 

    virtual ~MyClass() = default; 

    virtual void function1(int param1 = DefaultParam1, int param2 = DefaultParam2) = 0; 

    inline void function2() 
    { 
     function1(getStuff(DefaultParam1), getStuff(DefaultParam2)); 
    } 
    inline void function2(int param1) 
    { 
     function1(param1, getStuff(DefaultParam2)); 
    } 
    virtual void function2(int param1, int param2) = 0; 
}; 

예제에서 function2를 살펴 보겠습니다. 인라인 함수로 오버로드되었습니다. 장점 :

class MC : public MyClass 
{ 
public: 
    virtual void function1(int param1, int param2) 
    { 
    } 
    using MyClass::function2; 
    virtual void function2(int param1, int param2) 
    { 
    } 
}; 

int main() 
{ 
    MC mc; 
    ((MyClass&)mc).function1(); 
    mc.function2(); 
    return 0; 
} 

function1가 (상속하는 클래스를 반복하지 않고) 기본 매개 변수와 함께 사용할 수 캐스트가 필요 function2은 (불행하게도, 당신은 상속 클래스의 오버로드를 볼 수 있도록하기 위해 사용 절을 필요로하지 않는다 그래도).

사이드 노트 : 나는 첫 번째 방법은 멤버 변수 대신 매개 변수의 사용