부모 클래스가 데이터 클래스의 친구 클래스 인 다른 파생 클래스에서 데이터 클래스의 개인 멤버 변수에 액세스하는 방법은 무엇입니까?
-
21-08-2019 - |
문제
세 가지 수업이 있습니다.
PIMPL 패턴을 사용하는 데이터 홀더 클래스 CDATAHOLDER
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
CDATAHOLDER의 iPimpl 멤버에 액세스 해야하는 기본 클래스 CBase, CDATAHolder의 친구 클래스입니다.
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
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 클래스가 필요합니다.
제휴하지 않습니다 StackOverflow