부모 클래스가 데이터 클래스의 친구 클래스 인 다른 파생 클래스에서 데이터 클래스의 개인 멤버 변수에 액세스하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/851041

문제

세 가지 수업이 있습니다.

  1. PIMPL 패턴을 사용하는 데이터 홀더 클래스 CDATAHOLDER

    class CDataHolder
    {
    public:
      // ...
    private:
    friend class CBase;
    struct PImpl;
    PImpl* iPimpl;
    };
    
  2. CDATAHOLDER의 iPimpl 멤버에 액세스 해야하는 기본 클래스 CBase, CDATAHolder의 친구 클래스입니다.

    class CBase: 
    {
    protected:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. CBase에서 파생 된 클래스는 동일한 IPIMPL 멤버에도 액세스해야합니다. 여기에 문제가 발생합니다. 부모 수업은 친구 클래스이지만 파생 클래스는 IPIMPL 멤버를 사용할 수 없습니다. 이와 같이:

    class CDerived : public CBase
    {
    public:
    void doSth() {
       CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // this line raises an error: 
                                                         // "illegal access from CDataHolder to protected/private member CDataHolder::PImpl"
    }
    };
    

    파생 된 수업이 많이 있으므로 각 파생 클래스가 CDATAHOLDER 클래스에 "친구 클래스 CDERIVEDXXX"라인을 넣는 좋은 방법은 아닙니다. 이 문제를 극복하는 방법? 더 좋은 방법이 있습니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

당신이 선언 한 이후 struct PImpl Cdataholder 클래스의 개인 부분에서는 Cdataholder의 친구만이 동일하게 접근 할 수 있습니다. 전진 선언을하지 않겠습니까? struct PImpl 공개 섹션에서 또는 CDATAHOLDER 클래스 이전에 더 나은가요?

다른 팁

친구는 (정당하게) 매우 제한되어 있으며 상속받을 수 없습니다. 나는 의문을 제기하는 것을 싫어하지만 아마도 a) pimpl에 대한 공개 액세스 또는 그것의 일부 측면이 필요하거나 b) pimpl로 무언가를하려면 dataholder 클래스가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top