【问题标题】:Change field in a class更改类中的字段
【发布时间】:2021-07-05 10:26:25
【问题描述】:

我有一个运行良好的二叉树类 BTree,我没有更改任何内容。

class BTreeNode {
private:
    vector<string> data;
    BTreeNode *parent = nullptr;
    BTreeNode *leftChild = nullptr;
    BTreeNode *rightChild = nullptr;

public:
    BTreeNode();

    BTreeNode(vector<string> noteData);

    // getters and setters...
};

class BTree {
private:
    BTreeNode *root = nullptr;

public:
    BTree();

    void add(vector<string> newNodeValue);

    // other methods
};

但现在我想创建一个新的红黑树类RBTree。我认为通过继承来实现是个好主意。

第一个问题发生在红黑树的节点中。他们有一个额外的领域——颜色。如果红黑树RBTreeNode 的节点类继承BTreeNode,那么问题是BTreeNode 的getter 和setter 返回一个BTreeNode 对象,但我需要RBTreeNode

class RBTreeNode : public BTreeNode {
public:
    enum Colour { BLACK, RED };
private:
    Colour colour;

public:
    // constructors, getters and setters...
}

第二个问题是BTreeroot,因为在新的RBTree 类中,root 应该是RBTreeNode 类型。

那么,有没有办法以 OOP 方式解决它?还是我应该改变我的方法?

【问题讨论】:

  • 既然你确定每个指针都指向BTreeNode,那么向下转换就不会是一个邪恶的解决方案。但是使用(模板)组合并将来自BTree 的调用委托给具体实现可能比使用继承更容易。

标签: c++ oop inheritance architecture


【解决方案1】:

我猜继承不是解决这个问题的好方法。红黑树节点必须具有颜色变量,如果您使用继承,您将无法以正确的方式保持该值。我的红黑树节点是这样的:

struct RB_Tree_Node {
    vector<string> data;
    bool color;  // black = 0, red = 1;
    Node* left, * right, * parent;
    Node* sibling(Node* x) {
        if (x->parent == NULL)
            return NULL;

        if (x->parent->left)
            return x->parent->right;

        return x->parent->left;
    }
    bool hasRedChild() {
        return (left != NULL && left->color == 1) || (right != NULL && right->color == 1);
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多