2011-07-28 3 views
3

다음과 같은 것을하려고합니다.C++에서 함수 선언의 멤버 변수에 대한 참조?

class FOO { 
void bar(int& var = m_var) { 
    // .... 
} 
int m_var; 
}; 

왜이 컴파일되지 않습니까? 왜 그들은 이것을 언어로 프로그램하지 않았습니까? 이 동작을 모방 할 수있는 방법이 있습니까?

+0

의 중복 가능성 http://stackoverflow.com/questions/4539406/nonstatic-member-as- a-default-argument-of-nonstatic-member-function) – Nawaz

답변

6

m_var은 멤버 변수이며 개체를 통해 액세스해야하므로 허용되지 않습니다.
m_var이 클래스의 정적 멤버 인 경우 compile successfully이됩니다.

간단한 해결 방법은 동일한 이름 또는 (멤버 함수 &가 m_var에 대한 액세스를 갖는다) bar() 통해 다른 멤버 함수와 과부하 함수를 호출하여 원하는 같은 효과를 가질 것이다 reference.It 의해 매개로 m_var 합격 달성하기.

+0

@AIs - 함수 내부에서 m_var에 액세스 할 수 있으므로 혼동이 거의 없습니다. 예 : void bar (int & var) {cout << m_var; }. bar는 정적이 아닌 멤버 함수이며 FOO의 객체를 사용하여 호출 할 수 있기 때문에 허용 된 것처럼 보입니다. 똑같은 추론이 위의 정의에도 적용됩니다, 맞습니까? 왜 컴파일러는 비 정적 멤버에 직접 액세스하는지 불평합니다. – cppcoder

+0

@srikrish : 정적 변수가 아닌 멤버 함수 내에서 멤버 변수에 접근 할 때'membervar'라고하면 실제로'this-> membervar'를 수행합니다. 이것은 암시 적 매개 변수로 모든 멤버 함수에 전달됩니다. –

+0

@AIs - 그렇다면 컴파일러가 함수 인수에서 m_bar에 액세스 할 때 동일한 작업을 수행 할 수없는 이유는 무엇입니까? 길잡이 표시 줄은 FOO 개체를 사용하여 호출되므로이 포인터를 사용할 수 있습니다. Alexandre가 지적했듯이, 컴파일러의 한계처럼 보입니다. 그런 용도의 목적은 무엇일까? – cppcoder

4

동의합니다.이 내용은 언어의 제약 사항입니다. 컴파일러에 구현할 수 있습니다 (겸손한 견해로는).

는이 동작을 원한다면, 당신은 작성해야 :

class FOO 
{ 
    void bar(int& var) { ... } 
    void bar() { this->bar(m_var); } 

    int m_var; 
}; 

그리고 당신이 그것에 대해 걱정하는 경우에 여분의 함수 호출은 어떤 반 괜찮은 컴파일러에 의해 인라인 될 것입니다.

class FOO 
    { 
    private: 
     static int _ph_m_var; 
     void bar(int& var = _ph_var) 
     { 
       if(&var == &_ph_var) { // Default } 
     } 
}; 
0

한가지 해결책은 자리로서 작용할 것이다 정적 변수를 가질 것이다. 컴파일되고 실행됩니다.

const 정적이 m_var 트릭을해야 int로

[비 정적 멤버 함수의 기본 인수 비 정적 부재 (
0

선언 m_var 정적 CONST 수 :