【发布时间】:2014-03-19 03:09:49
【问题描述】:
给定一个名为 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 方法的帮助下设置这些?那就是我可以使用私有方法或其他技术来实现这一点,以便客户端代码不能更改属性(除非并且直到真正需要操作)?如何最大限度地隐藏数据并减少耦合?
编辑:我不想使用公共 setter 方法。有没有其他方法来操作(设置)私有属性? IE; AVLNode 对象如何在不使用公共 setter 方法的情况下设置其私有属性?
【问题讨论】:
-
我写C++已经有一段时间了,但我相信你所说的概念是“朋友”。 yosefk.com/c++fqa/friend.html
-
我没有考虑使用朋友关系。请参阅最后一部分:问题的“编辑”。明确的问题写在那里。
-
你问有没有其他方法,然后拒绝显而易见的答案。您希望 setter 不公开,但您希望有特权的类可以访问它。那是一个朋友。唯一的其他选择是在这种情况下没有意义的子类化。您还可以将验证代码添加到设置器以使其“更安全”。我认为你过于谨慎了。如果有人添加了“恶意”代码,那么他们就会破坏代码,那就是问题
-
感谢@Spidy,是的,我将使用朋友。它最适合这里。
标签: c++ data-structures binary-search-tree avl-tree