【问题标题】:Object-oriented Programming error? [duplicate]面向对象编程错误? [复制]
【发布时间】:2014-02-12 11:55:19
【问题描述】:

我的作业有一个问题,我需要用 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();
};

【问题讨论】:

  • 你的作业真的需要你自己写二叉树吗?因为std::set 应该适用于大多数用途。

标签: c++ class oop templates struct


【解决方案1】:

不,您不会使用struct“破坏” OOP 规则。

在 C++ 中,structs 和 classes 基本上是一样的,唯一的区别是它们成员的默认可见性。 (classes 成员默认为私有,structs 成员默认为公开。)

【讨论】:

  • 是的,我知道,但是 struct 的成员是公共的,对于 OOP,我不会破坏封装状态?
  • @Raid3nz 封装破坏不是由节点字段的公开性引起的,而是由于可以进入树并获取其节点这一事实。作为用户,很容易将您的 BST 变成根本不是 BST 的东西。
  • @Raid3nz - 是的,你这样做了,而且很糟糕。您正在返回指向 BinaryNode&lt;T&gt; 对象的可修改指针。用户可以修改根节点,例如将树变成非树。
【解决方案2】:

不,你没有。

在您的示例中,您可以更改类的结构,并且不会有任何问题(修改属性的可见性或创建新方法来访问/修改它们)。

【讨论】:

    【解决方案3】:

    您没有违反 OOP 规则。但是,由于 struct 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;
        };
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2010-09-18
      • 2018-12-10
      • 2023-03-31
      • 2011-06-21
      • 2012-03-02
      • 2012-09-09
      • 2011-07-09
      相关资源
      最近更新 更多