2014-02-12 6 views
-1

숙제에 대한 질문이 있는데 C++ 프로젝트가 필요하며 객체 지향 프로그래밍을 사용해야합니다. 이진 검색 트리를 사용하는 어휘입니다. 끝났습니다. 하지만 구조체를 사용하면 ... OOP 규칙을 위반하게됩니까? 그렇다면 어떻게 상속 된 클래스의 구조체를 변환 할 수 있습니까?객체 지향 프로그래밍 오류?

template <typename T> 
struct BinaryNode 
{ 
    T key; 
    BinaryNode<T>* left; 
    BinaryNode<T>* right; 
    BinaryNode<T>* parent; 
}; 

template <typename T> 
class BinarySearchTree 
{ 
private: 
    BinaryNode<T>* root; 
    BinaryNode<T>* newNode(T key); 
public: 
    BinarySearchTree(); 
    ~BinarySearchTree(); 

    void insert(T key); 
    BinaryNode<T>* search(T key); 
    void distance(T key); 
    void inorderTreeWalk(); 

    void insert(BinaryNode<T>** node, T key); 
    BinaryNode<T>* search(BinaryNode<T>* node, T key); 
    void distance(BinaryNode<T>* node, T key); 
    void inorderTreeWalk(BinaryNode<T>* node); 
    BinaryNode<T>* remove(BinaryNode<T>* node); 

    BinaryNode<T>* minimum(BinaryNode<T>* node); 
    BinaryNode<T>* maximum(BinaryNode<T>* node); 
    BinaryNode<T>* successor(BinaryNode<T>* node); 
    bool contains(T key); 

    BinaryNode<T>* getRoot(); 
}; 
+0

숙제가 실제로 당신이 필요합니까 자신의 바이너리 트리를 작성 하시겠습니까? 왜냐하면'std :: set'은 대부분의 목적을 위해 작동해야하기 때문입니다. –

답변

3

아니요, 아니요, struct을 사용하여 OOP 규칙을 "위반하지"마십시오.

C++ structclass은 기본적으로 동일한 것으로, 유일한 차이점은 멤버의 기본 표시입니다. (class 회원은 기본적으로 비공개이며 struct 회원은 기본적으로 공개입니다.)

+0

네, 구조체 멤버가 공개되어 있고 OOP의 경우 캡슐화 상태를 깨뜨리지 않습니까? – Raid3nz

+1

@ Raid3nz 캡슐화의 파손은 노드의 필드의 공개에 의한 것이 아니라 트리에 도달하여 노드에 도달 할 수 있다는 사실에 기인합니다. 사용자로서 BST를 BST가 아닌 무언가로 전환하는 것은 쉽습니다. – molbdnilo

+1

@ Raid3nz - 네, 그렇습니다. 'BinaryNode '개체에 수정 가능한 포인터를 반환하고 있습니다. 사용자는 예를 들어 루트 노드를 수정하고 트리를 비 트리로 만들 수 있습니다. –

1

아니요.

예를 들어 클래스 구조체를 변경할 수 있으며 속성에 대한 가시성을 수정하거나 속성에 대한 액세스/수정을위한 새로운 메소드를 만들 수 있습니다.

1

OOP 규칙을 위반하지 않았습니다. 구조체 BinaryNode는 BinarySearchTree 클래스의 맥락에서 사용된다 그러나 있기 때문에 BinarySearchTree 클래스의 당신의 실현의 내부가 숨겨져있을 것 같은 방식으로, 그것을 중첩 클래스를 확인하는 것이 좋습니다 :

template <typename T> 
class BinarySearchTree 
{ 
private: 
    template <typename T> struct BinaryNode 
    { 
     T key; 
     BinaryNode<T>* left; 
     BinaryNode<T>* right; 
     BinaryNode<T>* parent; 
    }; 
...