2011-01-12 5 views
9

"프로젝트에서 사적 상속을 사용하고 있습니다." 기본 클래스는 연산자 []를 정의하며, 이것은 내가 사용하고자하는 기능입니다. 따라서, 내가 가지고있다개인 상속 사용 지시문, 과부하?

그러나 어떻게 내가 얻을 수있는 연산자의 버전을 제어 할 수 있습니까? 사실 constconst 버전 둘 이상이 필요합니다. 이것이 성취 될 수 있습니까?

+3

이 경우에는 composition을 사용하여 개인 상속 대신 원하는 결과를 얻을 수 있습니다. – James

+1

그래, 나도 알아 ... 대신 포워딩 코드의 양을 줄이기 위해 사적 상속으로 바꿨다. 그래서 불가능하니? 함수를 어떻게 선택합니까? – carlpett

+0

여기에서 개인 상속 대신 컴포지션을 사용하면 코드를 작성하고 유지 관리하는 것이 훨씬 쉬울 것입니다. 어림짐작은 절대적으로 필요하지 않을 때 C++의 벽이 아닌 기능을 사용하지 않는 것입니다 (지금까지 말한 것에서는이 경우 개인 상속이 필요하지 않음). –

답변

6

내 이해는 using에 자동으로 모든 다른 과부하가들 어와 야합니다. 특정 과부하가 하위 클래스로 가져 오지 못하게 할 것입니까? 이 경우 작업을 상위의 몇 가지 다른 이름의 함수로 분할하고 필요한 것만을 using으로 분할하는 것이 좋습니다.

+0

나는 그렇게 생각했을 지 모르지만,'T &'와'const T &'(템플릿 typename T)를 모두 반환하는 버전이 있음에도 불구하고 const-discarding에서 컴파일 오류를 얻는다. – carlpett

+0

그래서이 중 하나가 " "times ... 코드를 위아래로보고 재 컴파일 한 후, 갑자기 작동하고, 내가 변화 한 것을 이해할 수 없습니다. 상속에 대해 조금 더 배웠지 만 변경된 부분은 무엇입니까? 감사합니다! – carlpett

2

이 예상대로 수행 : 다른 말로

class A 
{ 
public: 
    int operator[](int idx) { return 0; } 
    int operator[](int idx) const { return 1; } 
}; 

class B : public A 
{ 
public: 
    using A::operator[]; 

    void opa() { cout << operator[](1) << endl; } 
    void opb() const { cout << operator[](1) << endl; } 
}; 

int main(void) 
{ 
    B b; 
    b.opa(); 
    b.opb(); 

    const B d = B(); 
    cout << d[1] << endl; // should trigger the const version of operator[] 
    return 0; 
} 

가 적절한 CONST/비 CONST 버전 B 주입된다. 참고 : const 버전이 제공되지 않으면 컴파일러 오류가 발생합니다 (이 작업은 상속이 비공개 또는 공용인지 여부에 관계없이).

+0

감사합니다, 좋은 예! – carlpett

+0

'b [2]; 나'main'과 비슷하게 연산자 함수가'class B' 바깥에서 직접 사용될 수 있음을 나타냅니다. – aschepler

+0

@aschepler, 좋은 지적, 업데이트 예정입니다 ... – Nim