c++ - 公共(public)设置方法的替代方法

标签 c++ data-structures binary-search-tree avl-tree

给定一个名为 AVLNode 的类,其中包含树的节点描述,

template<typename T>
class AVLNode
{
 public:
    AVLNode(T, AVLNode<T>*, AVLNode<T>*, int);
    ~AVLNode();
    void setLeft(AVLNode<T>*);
    AVLNode<T>* getLeft() const;
    void setRight(AVLNode<T>*);
    AVLNode<T>* getRight() const;
    void setHeight(int);
    void setKey(const T& );
    int getHeight() const;
    const T& getKey() const;

  private:
    T key;
    AVLNode<T> *left;
    AVLNode<T> *right;
    int height;
  };

以及类 AVLTree 中的以下旋转方法。

template<typename T>
AVLNode<T>* AVLTree<T>::rotateRight(AVLNode<T> *node1)
 {
   AVLNode<T> *node2 = node1->getLeft();
   AVLNode<T> *T2 = node2->getRight();

   // Perform rotation
   node2->setRight(node1);
   node1->setLeft(T2);

  // Update heights
   node1->setHeight(max(height(node1->getLeft()), height(node1->getRight()))+1);
   node2->setHeight(max(height(node2->getLeft()), height(node2->getRight()))+1);

  // Return new root
   return node2;
 }

有没有办法在没有公共(public) setter 方法帮助的情况下设置这些?那就是我可以使用私有(private)方法或其他技术来实现这一点,以便客户端代码无法更改属性(除非并且直到真正需要操作为止)?如何最大限度地隐藏数据并减少耦合?

编辑:我不想使用公共(public) setter 方法。还有其他方法可以操纵(设置)私有(private)属性吗? IE; AVLNode 对象如何在不使用公共(public) setter 方法的情况下设置其私有(private)属性?

最佳答案

我认为您有一些名为 AVLTree 或类似名称的容器。

如果是这样,我会定义一个类:

template <typename T>
class AVLNode
{
  protected:   
    T key;
    AVLNode<T>* left;
    AVLNode<T>* right;
    int height;

  public:
    AVLNode<T>* getRight() const { return right: }
    AVLNode<T>* getLeft()  const { return left;  }
};

template <typename T>
class WritableAVLNode : public AVLNode<T>
{
   public:
      void setRight(AVLNode<T>* right) { AVLNode<T>::right = right; }
      void setLeft(AVLNode<T>* left)   { AVLNode<T>::left = left; }
};

所有内部类都将与 WritableAVLNode 一起使用,但这些方法将只公开只读版本:AVLNode。

关于c++ - 公共(public)设置方法的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22495430/

相关文章:

c++ - 如何正确理解回车符(又名\r)?

c++ - WaitForSingleObject 信号过早 ImageMagick 转换

algorithm - 选择排序运行时困惑

data-structures - 公式的后序遍历

c - BST C语言如何删除子树?

algorithm - 这个算法是O(d)吗,其中d是二叉搜索树的深度

c++ - 暂停程序直到 ofstream::flush() 完成

c++ - 成员引用基类型 'Node<int> *' 不是结构或 union

c++ - 没有递归 C++ 的 AVL 树插入

c++ - 如何初始化句柄