公共制定者方法的替代方案

时间:2014-03-19 03:09:49

标签: 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;
 }

有没有办法在没有公共setter方法的帮助下设置这些?我可以通过私有方法或其他技术实现这一点,以便客户端代码不能更改属性(除非并且直到真正需要操作)?如何最大化数据隐藏并减少耦合?

编辑:我不想使用公共设置器方法。有没有其他方法来操纵(设置)私有属性?即; AVLNode对象如何在不使用公共setter方法的情况下设置其私有属性?

2 个答案:

答案 0 :(得分:1)

我认为你有一些名为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,但方法只公开readonly版本:AVLNode。

答案 1 :(得分:0)

如果您希望AVLTree有权访问AVLNode的私人或受保护成员,则可以使用friend声明。这将假设树和节点使用相同的类型。

template <typename T>
class AVLNode
{
    friend class AVLTree<T>;    
};