2014-02-12 36 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; 
    }; 
...