2010-12-19 6 views
3

A::foo()B::bar()에서 다음 샘플로 호출하는 좋은 방법이 있습니까?C++ 공통 기본 클래스의 private/protected 함수 호출

class A { 
protected: 
    void foo() {} 
}; 

class B : public A { 
public: 
    void bar(A& a) { // edit: called with &a != this 
    a.foo(); // does not work 
    } 
}; 

나는 A의 친구가 B를 선언 이외 생각할 수 없다,하지만 좀 더 클래스 꽤 추한 얻을 수 있습니다.

아이디어가 있으십니까?

+0

왜'B :: bar'는'A :: foo'를 호출해야합니까? 'A :: foo'가 보호된다면, 그것은'A' 타입의 객체와'A'에서 파생 된 타입 만이 그것을 호출 할 수 있어야한다는 것을 의미합니다. 무관 한 클래스에서'A :: foo'를 실제로 호출해야한다면 아마 보호되어서는 안됩니다. –

+0

그리고 무엇이 문제입니까? –

+0

'B'가'A'의 타입 일 때'B'에'A' 인스턴스를 넘기는 이유는 무엇입니까? – birryree

답변

4

처럼

class B : public A { 
public: 
    void bar() { 
    foo(); 
    } 
}; 

또는 : 당신은 다음과 같이 할 수 있습니다.

class A { 
protected: 
    void foo() {} 
    void do_other_foo(A& ref) { 
     ref.foo(); 
    } 
}; 

class B : public A { 
public: 
    void bar(A& a) { // edit: called with &a != this 
    this->do_other_foo(a); 
    } 
}; 
+0

입니다. 별로 좋지는 않지만 아마도 가장 좋은 솔루션입니다. 감사! –

3

왜 A 유형의 객체를 전달합니까? 예, 기본 수준의 기능을 사용할 수 있습니다이

class B : public A { 
public: 
    void bar() { 
    A::foo(); 
    } 
}; 
+0

'* :: this'에'B :: bar'을 사용하려하지 않았지만 다른 인스턴스 (사실 A의 다른 서브 클래스에 있음)에는 사용하려고하지 않았습니다. –

+0

@lucas 디자인 문제 같은 것 같습니다. foo()가 보호되는 이유는 무엇입니까? –

+0

위의 게시물을 참조하십시오. 내 라이브러리 외부의 클래스/함수가이를 사용하는 것을 원하지 않습니다. 물론 작동하는 –

1

여기 어떤 파생 클래스 또는 객체에 의해 호출을 허용, 액세스처럼 "보호"제공에 대한 접근 방식이다.

struct A 
{ 
protected: 
    //Zero sized struct which allows only derived classes to call privileged methods 
    struct DerivedOnlyAccessToken{}; 

public:  //public in the normal sense : 
    void foo() {} 

public:  //For derived types only : 
    void privilegedStuff(DerivedOnlyAccessToken aKey); 
}; 

struct B: A 
{ 
    void doPrivelegedStuff(A& a) 
    { 
     //Can create a token here 
     a.privilegedStuff(DerivedOnlyAccessToken()); 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    A a; 
    a.foo(); 
    a.privilegedStuff(A::DerivedOnlyAccessToken()); // compile error. 

    B b; 
    b.doPrivelegedStuff(a); 

    return 0; 
} 

이 내 생각이 아니다 : 그것은 유엔 - 잠금 특권 방법에 필요한 보호 토큰 유형을 사용합니다. 나는 그것을 어떤 곳에서 읽었다. 나는 그것이 교활한 생각 인 사람을 기억하지 못한다.

컴파일러가 aKey 매개 변수를 삭제할 수 있다고 예상합니다.

+0

아주 좋은 생각, 많이 고마워! –

관련 문제