2014-10-28 1 views
1

현재 계층 구조의 일종을 구현 중이고 자식이 부모에 연결되어 있으면 부모 엔터티를 자식에게 할당해야합니다. 부모 클래스의 friend 메서드를 사용하여이 문제를 해결할 수 있고 좋은 코딩 스타일이 될 수 있다면 제 질문이 있습니다.C++을 사용하는 계층 적 구조의 친구 메서드

class Node { 
    Node* parent; 

    Node() : parent(nullptr) { } 

    friend void attachChild(const Node& child) const; 
    friend void detachChild(unsigned long idx) const; 
}; 

class ListNode : public Node { 
    std::vector<Node*> childs; 

    ListNode() : Node() { this->childs = {}; } 

    void attachChild(Node* child) const { 
     child->parent = this; 
     childs.push_back(child); 
    } 

    void detachChild(unsigned long idx) const { 
     child->parent = nullptr; 
     child.erase(child.begin() + idx) 
    } 
}; 

class NodeOne : public Node {}; 
class NodeTwo : public Node {}; 
class NodeThree : public Node {}; 

그리고 마지막으로 짧은 코멘트를 : : 여기가 무슨 뜻인지 설명하는 짧은 예는 자녀와 부모가 같은 종류의 내 시나리오에있을 수있는 반면 아이 엔티티는 분명히 그냥 하나의 상위 엔티티를 가질 수있다.

+0

. 비록 그것을 사용하지 않는 경우가 있지만, 귀하의 경우에는 setter/getter 기능을 갖는 것이 더 나을 수도 있습니다. 'Node' 클래스가'Parent' 클래스 내부의 private 내부 클래스가 될 수 없다면,'friend'를 사용하는 것은 괜찮은 해결책이 될 수 있습니다. –

+0

노드와 부모는 항상 동일한 기본 클래스에 의존하며 둘 다 부모를 가질 수 있습니다 (예제 업데이트). 그게 도움이 되겠습니까? – Phidelux

답변

0

,이 경우에는 잘못된 코딩 스타일입니다. 일반적으로 이와 같은 계층 구조의 경우 부모/자식 관계에 대한 정보가 노드 자체에 보관됩니다.

ListNode 클래스는 중복되어 있으며, 실제로이 기능은 노드 자체에 속하므로 클래스를 친구로 삼을 필요가 있습니다.

노드 클래스에 setParent 메소드를 추가하기 만하면 친구 기능을 사용하지 않아도됩니다. 노드 만 부모/자식 관계로 엉망이 될 수 있도록하려면 개인/보호로 설정하십시오.

class Node { 

public: 

    Node() : parent(nullptr) { }; 

    int addChild(Node* child) 
    { 
     child->setParent(this); 
     this->children.push_back(child); 

     int idx = this->children.size() - 1; 
     return idx; 
    }; 
    void removeChild(unsigned long idx) 
    { 
     Node* child = children.at(idx); 
     child->setParent(nullptr); 
     this->children.erase(children.begin() + idx); 
    } 

private: 

    void setParent(Node* node) 
    { 
     parent = node; 
    } 

private: 

    Node* parent; 
    std::vector<Node*> children; 
}; 

예 : friend`는 좋은 선택이, 종종 나쁜 디자인의 징조 거의 없다`사용

int main(int argc, char* argv[]) 
{ 
    Node parent; 
    Node child; 
    parent.addChild(&child); 
} 
관련 문제