2013-10-11 5 views
1

내 클래스 gTexture에서 데 두 개의 함수 선언 :단순화 과부하 수준의 기능

void gTexture::DrawTexture() 
    { 
    gTexture::DrawTexture(mActiveTexture); 
    } 

내가

virtual void    DrawTexture(unsigned short int TextureNumber=mActiveTexture); 
처럼 하나의 기능 일이있을 싶습니다

public: 
           gTexture():mActiveTexture(0){...} 
    virtual void    DrawTexture(); 
    virtual void    DrawTexture(unsigned short int TextureNumber); 
      int     mActiveTexture; 

mActiveTexture가 비 정적 데이터 멤버를 잘못 사용하기 때문에 컴파일되지 않습니다. 파생 된 객체로 쉽게 처리 할 수있는 함수가 하나 뿐인 방법이 있습니까? 감사.

+1

'void foo() : x (y) {...}'란 무엇입니까? – juanchopanza

+0

@juanchopanza 이니셜 라이저는 생성자에서만 수행 할 수 있습니다. – wich

+0

@wich DrawTexture는 생성자가 아닙니다. – juanchopanza

답변

1

두 가지 방법이 있습니다. 둘 다 해결 방법이 있지만 유용 할 수 있습니다.

하나는 매개 변수없는 함수를 가상이 아닌 것으로 만드는 것입니다. mActiveTexture으로 두 번째 전화를 걸면됩니다.

다른 방법이 도메인 지식 (0 유효한 OpenGL은 텍스처 이름이 아닌 것을 구체적 사실)을 사용하는 것입니다 :

virtual void DrawTexture(unsigned short int TextureNumber = 0) { 
    if (TextureNumber == 0) TextureNumber = mActiveTexture; 
    // ... rest of the code 
} 
+1

가상 멤버 함수의 기본 매개 변수가 너무 무서운 것 같아요. – juanchopanza

+0

@juanchopanza 참으로 적어도 말하기에는 문제가 있습니다. 기본값은 컴파일 시간이며 사용되는 것은 실제 객체가 아닌 포인터/참조 유형에 따라 다릅니다. – wich

+0

오, 큰 도움, 고마워. 그러나 두 번째 지역 임시 변통은 효과가 없을 것입니다. [0]은 제 경우의 텍스처 벡터 벡터의 첫 번째 요소를 나타냅니다. – user2856452

0

당신은 유효하지 않은 기본 인수 값을 가질 수있다 (예를 들어, -1). 그런 다음 함수가 해당 값이 기본값인지 검사 할 수 있습니다. 그렇다면 mActiveTexture를 사용하십시오. 그렇지 않으면 인수가 사용됩니다.

+0

그게 좋은 생각이지만 위험한 배열과 -1을 사용하여 고려 내 프로그램을 충돌 수 있습니다. 나는 그것을 가지고 있었지만 그 이유 때문에 내 프로그램 전체에서 -1에서 벗어났다. – user2856452

0

아니요, 회원을 기본값으로 사용할 수 없습니다. 기본값은 컴파일 타임에 사용됩니다.

그러나 -1과 같은 특수 값을 사용하고 입력 값이 -1이면 DrawTexture를 체크인하고, 그렇다면이를 mActiveTexture로 설정할 수 있습니다.