2017-03-27 2 views
0

프로젝트에서 계층 구조 수준을 가진 그래프를 구현하는 클래스 계층 구조가 있습니다 (즉, 그래프 노드는 그래프 자체 일 수 있습니다 - 전자라고 생각할 수 있습니다 예를 들어, 게이트가 실제로 집적 칩일 수있는 회로). 따라서, 나는 BaseGroupLeaf로 파생 된 클래스가 있고, 클래스 Base 내가 아닌 다른 곳에서, Group의 주어진 방법 (아이를 추가 할 때)에서 설정할 수 있도록하고 싶습니다 속성 ancestor을 가지고 있습니다 :특정 파생 클래스의 기본 클래스 멤버에 대한 액세스 허용

class Group; 

class Base { 
    private: // or protected? 
     Group* ancestor; 
}; 

class Group : public Base { 
    private: 
     void setAncestor(Base* child) { 
      // Something like 
      child->ancestor = this; 
     } 
}; 

class Leaf : public Base { 
    // ... 
}; 

"올바른"방법은 무엇입니까? 보통, 나는 friend 메쏘드를 사용할 것이지만,이 문맥에서는 불가능하다고 생각한다. 전에 선언해야만하는 Base에 친구 Group::setAncestor을 선언해야 할 것이기 때문이다. (이러한 선언은 실제 코드에서 다른 파일에 있습니다.)

+0

이 ancestor'이 공개'하지 않으면 작동하지 않습니다. 'Group'은 자신의 * 기본 클래스의 protected 멤버에 접근 할 수 있습니다. 'Base '포인터를 통해 보호 된 멤버에 접근 할 수 없습니다.'Leaf '와 같은 무관 한 클래스의 기반이 될 수 있기 때문입니다. –

+1

전체 친구 친구, 즉'친구 클래스 그룹 '을 만들 수 있습니다. – songyuanyao

+0

전달 선언과'friend'를 사용할 수 있습니다. – Raito

답변

0

데이터 멤버 Base :: ancestor는 액세스를 보호해야합니다. 그렇게하면 파생 된 클래스에서 사용할 수 있습니다.

0

BaseLeaf 클래스에서 보호 된 것으로 선언 할 수 있으며 다른 곳에서는 개인 상속을 사용하므로 보호 된 멤버는 비공개가됩니다. 내가 child에서 newAncestor로 이름을 변경

class Group; 

class Base { 
    protected: 
     Group* ancestor; 
}; 

class Group : public Base { 
    private: 
     void setAncestor(Base* newAncestor) { 
      // Something like 
      ancestor = newAncestor->ancestor; 
     } 
}; 

class Leaf : private Base { 
    // ... 
}; 

참고. 새 아이를 만들 때

그래서 당신은 같은 것을 할 수 있습니다

Base ancestor; 
Group child; 
child->setAncestor(&ancestor) 
+0

동일한 효과가 없습니다. –

+0

@ O'Neil 물론'setAncestor()'는 내 예제에서 다른 서명을 가지고 있습니다. 그냥 제안. 하지만 그게 당신이 말하는 것인지 확실하지 않습니다. – Rama

+0

예. 예. 요점은 ** 다른 인스턴스를 가리 키도록 '조상'을 갖는 것입니다. '이'가 아닙니다. –