2012-02-15 4 views
19

선택적 멤버 함수 중 하나에 대한 인수를 만들고 싶습니다. 인수가 제공되지 않으면 멤버 변수를 사용합니다. 나는 그것을 컴파일하려고 할 때C++에서 멤버 변수를 기본 인수로 사용하는 방법은 무엇입니까?

그러나 "오류 : 비 정적 데이터 멤버 '객체 :: initPos'의 잘못된 사용"을 보여줍니다

그냥 문제를 격리하기 위해, 나는 디폴트에 시도하는 int 유형을 그리고 그것은 잘 컴파일됩니다. 내 코드의 문제점 및 기본 값으로 멤버 함수를 사용하는 방법이 궁금합니다.

도움 주셔서 감사합니다.

Object.h

class Object 
{ 
    public: 
     ... 
     void MoveTo(double speed, Point position); 

    protected: 
     Point initPos; 
     Point currPos; 

}; 

Object.c

void Object::MoveTo(double speed, Point position = initPos) 
{ 
    currPos = postion; 
} 

Point.h

class Point 
{ 
    ... 

    private: 
     double x; 
     double y; 
     double z; 
}; 
+1

귀하의 질문이 나 산란 만든이 하나 http://stackoverflow.com/questions/9286801/valid-expressions-for-default-function-arguments –

답변

30

멤버 함수의 기본 인수 식은 클래스 또는 전역 범위에있는 것만 사용할 수 있습니다. 디폴트 인수는 메소드의 선언 (즉, 헤더 파일)에 지정되어야합니다.

이 문제를 해결하려면 MoveTo 메서드를 두 번 오버로드해야합니다. 하나는 인수를 취하고 다른 하나는 2 개의 인수를 취합니다. 1 인수를 취하는 메소드는 다른 메소드를 호출하여 기본값으로 간주하는 값을 전달합니다. 당신이 MoveTo(double) 전화 MoveTo(double, Point)을 할 때, 당신이하여 DRY 원칙을 존중 한 번만 MoveTo의 구현을 쓸 수 있다는

void Object::MoveTo(double speed) 
{ 
    MoveTo(speed, initPos); 
} 

void Object::MoveTo(double speed, Point position) 
{ 
    // Everything is done here. 
} 

참고.

+0

감사! 나는 내가 이렇게 할 수 있음을 안다. 기본 방법으로 만드는 것과 같은 더 짧은 방법이 있는지 궁금합니다. 그러나 이것이 이것이 할 수있는 유일한 방법이라고 생각합니다. – tuzzer

+0

그렇다면 하나의 선택적 인수 대신에 많은 인수가 있습니까? void Object :: MoveTo (배속, 포인트 위치 = initPos, 포인트 a = m_a, 포인트 b = m_b, 포인트 c = m_c) 그럼 많은 기능을 만들지 않습니까 ??? – tuzzer

+0

@MatthewChan : 불행히도 그렇습니다. 많은 인수를 전달하는 대신 사용자가 객체를 전달할 수 있도록 디자인을 변경할 수 있습니다.이 개체에는 이미 적절한 기본값이 포함되어 있으며 사용자는 다른 기본값으로 변경해야합니다. 이런 식으로 결정한다면 Method Chaining 관용구에 관심이있어 여러 매개 변수를보다 간결하게 설정할 수 있습니다 (http://en.wikipedia.org/wiki/Method_chaining). –

10

기본값 즉, 프로토 타입의 일부가 아닌 그들이 해결하고 호출자가 아니라 함수 자체. 그래서 첫째, 호출자가 볼 수 있어야합니다. 둘째, 보호 된 클래스의 멤버는 액세스 할 수 없습니다. (나는 공개 멤버를 기본값으로 사용할 수 없다고 확신하지만 체크하기에는 너무 지쳤습니다.)

문제를 해결하려면 다른 답변에서 제안 된대로 연쇄 된 오버로드를 사용하십시오.

+0

감사합니다. 나는 initPos를 public으로 변경하려고 시도했지만, 여러분이 말했듯이, 여전히 작동하지 않을 것입니다. 그래서 우리는 상수를 기본 인수로만 사용할 수 있습니다 (멤버 함수가 아닌, 사용자가 입력 할 수있는 것과 같은) ?? – tuzzer

1

당신은 그런 함수 멤버를 오버로드 할 수 있습니다

void Object::MoveTo(double speed, Point position) { 
    .... 
} 

void Object::MoveTo(double speed) { 
    Point position = this->initPos; 

    MoveTo(speed, position); 
} 
+0

불행히도 그 일을 처리 할 수있는 유일한 방법은 못 생겼습니다. ( – Argento

관련 문제