2014-11-18 3 views
10

해당 멤버 함수를 수동으로 오버로드하고 해당 멤버를 인수로 사용하여 첫 번째 오버로드를 호출하는 것보다 다른 방법이 있습니까?클래스 멤버를 멤버 함수의 기본 인수로 사용

가 현재 나는이 작동하지해야하는 이유를 기술적 이유가없는 것 같아요 :

나는 (http://goo.gl/36p4CF 그것을 테스트)

class test 
{ 
    string t1="test"; 

    testfun(string& val = this->t1) 
    { /* modify val somehow */ } 
}; 

의 라인을 따라 뭔가를하려합니다.

  • 과부하 및 매개 변수 수동 설정을 제외하고이 방법으로 해결할 수있는 솔루션이 있습니까?
  • 왜이 기능이 작동하지 않습니까? 기술적 인 이유가 있습니까?
+0

"test"를 사용하면 성능이 저하되거나 메모리 사용량이 증가하지 않으므로 상수가됩니다. –

+0

@self : 그러나't1'은 일정하지 않습니다; 그래서 그것을 일정한 값으로 대체하는 것은 반드시 똑같은 일을하지는 않을 것입니다. –

+0

"test"문자열 리터럴을 사용하는 것입니다. –

답변

14

[dcl.fct.default]/8

키워드 this이 멤버 함수의 기본 인자에 사용할 수 없다.

이것은 일반적인 문제의 특수한 경우입니다. 매개 변수의 기본 인수에서 다른 매개 변수를 참조 할 수 없습니다. 나는.

void f(int a, int b = a) {} 

이 형성되지 않습니다. 그래서 컴파일러로 형태 void f(int i = j) {}의 멤버 함수를 변환 무엇을 기본적으로 어떤

class A 
{ 
    int j; 
}; 

void f(A* this, int i = this->j) {} 

될 것이다. 이것은 함수 인수 및 후위 표현식 (객체 인수를 구성하는)의 평가 순서가 지정되지 않았다는 사실에서 기인합니다. [dcl.fct.default]/9 :

기본 인수는 함수가 호출 될 때마다 평가됩니다. 함수 인수의 평가 순서가 지정되지 않았습니다. 결과적으로 함수의 매개 변수는 평가되지 않은 경우에도 디폴트의 인수에서 사용되지 않습니다.

+0

그래, 문제가 생겼어. 그러나 구문상의 설탕은 좋을 것이다;) –

+0

@thigg 그것을 부정 할 수 없다. : D 귀하의 경우 과부하는 합리적인 가독성으로 작업을 수행해야합니다. – Columbo

+0

그래,하지만 몇 가지 기능 때문에이 일을 성가시다.) –

1

당신이 원하는 것을 말하지 않았습니다. 각 인스턴스가 특정 클래스 변수에 따라 특정 방식으로 반응해야한다고 가정합니다.

그러나 인스턴스 별 동작이 필요하지 않은 경우 정적 변수를 사용할 수 있습니다. 다음 작품 :

#include <iostream> 
using namespace std; 
struct test { 
    static string t1; 
    void say(const string &val=t1){ 
    cout << val << "!" << endl; 
    } 
}; 

string test::t1; 

int main() { 
    cout << "Hello World" << endl; 
    test::t1 = string("asd"); 
    test a; 
    a.say(); 
    a.say("bla"); 
    test::t1 = string("blahblah"); 
    a.say(); 
    return 0; 
} 

... 클래스 test의 모든 개체가 기본 값으로 정적 문자열 t1를 사용하는 것을 의미합니다.

당신은 조금 "해킹", 그리고 못생긴 감시로 사용할 수 있습니다

void say(const string &val=t1){ 
    if (&val == &t1) { 
     // They are using the default value, so act as you want 
    } else { 
     // they are providing a value 
    } 
    } 
+0

정적인데 –

+1

@thigg 면책 조항 : 성취하고자하는 바가 없다. 그렇습니다. 저는 여러분의 필요를 이해하지 못했고, 단지 정적이 아닌 정적에 대해 약간의 통찰력을주고 싶었습니다. 좋아, 나는 내 대답을 약간 편집 하겠지만, 나는 그것이 당신의 질문에 도달하는 사람들에게 원격으로 유용하다고 생각한다. – MariusSiuram

+1

예, 검색하는 사람들에게 유용 할 수 있습니다. 전반적으로 여기는 매우 교육적이라고 생각합니다. –

1

그것을 과부하를 수동으로 매개 변수를 설정 제외하고는이 방법을 수행하는 솔루션이 있습니까?

아니요, 기본 매개 변수가 다른 매개 변수 (예 : this)에 의존하도록하려면 과부하가 필요합니다. 이 경우 생성자이기 때문에 이해가되지 않지만 t1은 호출되기 전에 존재하지 않습니다.

왜 작동하지 않습니까? 기술적 인 이유가 있습니까?

함수 인수의 평가 순서가 지정되지 않았기 때문에. 기본 인수에서 매개 변수 값을 허용하려면 각 매개 변수가 사용되기 전에 초기화되었는지 훨씬 더 복잡한 규칙이 필요합니다.

관련 문제