2014-02-12 37 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++ struct s和class es基本上是一樣的東西,唯一的區別是它們的成員的默認可見性。 (class es會員默認爲私人,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; 
    }; 
...