다음과 같은 것을하려고합니다.C++에서 함수 선언의 멤버 변수에 대한 참조?
class FOO {
void bar(int& var = m_var) {
// ....
}
int m_var;
};
왜이 컴파일되지 않습니까? 왜 그들은 이것을 언어로 프로그램하지 않았습니까? 이 동작을 모방 할 수있는 방법이 있습니까?
다음과 같은 것을하려고합니다.C++에서 함수 선언의 멤버 변수에 대한 참조?
class FOO {
void bar(int& var = m_var) {
// ....
}
int m_var;
};
왜이 컴파일되지 않습니까? 왜 그들은 이것을 언어로 프로그램하지 않았습니까? 이 동작을 모방 할 수있는 방법이 있습니까?
m_var
은 멤버 변수이며 개체를 통해 액세스해야하므로 허용되지 않습니다.
m_var
이 클래스의 정적 멤버 인 경우 compile successfully이됩니다.
간단한 해결 방법은 동일한 이름 또는 (멤버 함수 &가 m_var
에 대한 액세스를 갖는다) bar()
통해 다른 멤버 함수와 과부하 함수를 호출하여 원하는 같은 효과를 가질 것이다 reference.It 의해 매개로 m_var
합격 달성하기.
@AIs - 함수 내부에서 m_var에 액세스 할 수 있으므로 혼동이 거의 없습니다. 예 : void bar (int & var) {cout << m_var; }. bar는 정적이 아닌 멤버 함수이며 FOO의 객체를 사용하여 호출 할 수 있기 때문에 허용 된 것처럼 보입니다. 똑같은 추론이 위의 정의에도 적용됩니다, 맞습니까? 왜 컴파일러는 비 정적 멤버에 직접 액세스하는지 불평합니다. – cppcoder
@srikrish : 정적 변수가 아닌 멤버 함수 내에서 멤버 변수에 접근 할 때'membervar'라고하면 실제로'this-> membervar'를 수행합니다. 이것은 암시 적 매개 변수로 모든 멤버 함수에 전달됩니다. –
@AIs - 그렇다면 컴파일러가 함수 인수에서 m_bar에 액세스 할 때 동일한 작업을 수행 할 수없는 이유는 무엇입니까? 길잡이 표시 줄은 FOO 개체를 사용하여 호출되므로이 포인터를 사용할 수 있습니다. Alexandre가 지적했듯이, 컴파일러의 한계처럼 보입니다. 그런 용도의 목적은 무엇일까? – cppcoder
동의합니다.이 내용은 언어의 제약 사항입니다. 컴파일러에 구현할 수 있습니다 (겸손한 견해로는).
는이 동작을 원한다면, 당신은 작성해야 :
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 }
}
};
한가지 해결책은 자리로서 작용할 것이다 정적 변수를 가질 것이다. 컴파일되고 실행됩니다.
const 정적이 m_var 트릭을해야 int로
[비 정적 멤버 함수의 기본 인수 비 정적 부재 (선언 m_var 정적 CONST 수 :
의 중복 가능성 http://stackoverflow.com/questions/4539406/nonstatic-member-as- a-default-argument-of-nonstatic-member-function) – Nawaz