给定一个名为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方法的情况下设置其私有属性?
答案 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>;
};