C ++의 우정을 상속 받습니까?
-
16-09-2019 - |
문제
C ++에 계급 우정이 상속되지 않기 때문에 "가짜"하는 가장 좋은 방법은 무엇입니까?
나는 To-be-inherited Base 클래스에서 보호 된 방법을 통해 친구 클래스의 개인 인터페이스를 노출시키는 것에 대해 생각하고 있었지만 동일한 인터페이스를 두 번 쓰고 유지해야합니다.
다른 방법이 있습니까?
해결책
a의 사용 열쇠 가능한 해결책입니다.
아이디어는 당신이있는 경우에만 작업을 잠금 해제 할 수 있다는 것입니다. 열쇠... 그러나 예를 들어 단어에 수천 명의 가치가 있으므로 다이빙하자 :
// Step 1: The key
class NeedAccess;
namespace details { class Key { friend NeedAccess; Key() {} }; }
// Step 2: NeedAccess
class NeedAccess
{
protected:
static details::Key GetKey() { return details::Key(); }
};
// Step 3: The big one
class BigOne
{
public:
void lockedMethod(details::Key);
};
카피 구성 가능한 핵심의 문제는 토론에 달려 있습니다. 나는 당신이 그것을 방해함으로써 얻을 수있는 것을 보지 못합니다.
또 다른 장점은 액세스하려는 방법에 따라 여러 가지 열쇠를 가질 수 있다는 것입니다.
편집하다:
이 방법은 제한된 우정이라고하며 comp.lang.c ++. 중재.
이 방법의 주요 장점은 개인 인터페이스, 전방 선언 만 필요하기 때문에 느슨한 커플 링입니다.
다른 팁
Frinedship을 가진 수업의 아이들은 부모에게 접근을하도록 요청해야합니다.
class CrustyNeighbour
{
private:
friend class Bob;
void useWiFi(std::string const& data);
};
class Bob
{
protected:
useWifi(CrustyNeighbour& neighbour,std::string const& data)
{ neighbour.useWiFi(data);}
};
class Mary: public Bob // Bob's offspring
{
void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour
{
useWifi(owner,gameData); // use wifi via his/her parent who access to eighbours wifi
}
};
이것이 당신이 이미 생각하고있는 것이 아닌지 확실하지 않지만 여기에 가상 친구 예시
제휴하지 않습니다 StackOverflow