给出一个包含有一个树的节点描述的一类称为AVLNode,替代的公共setter方法
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;
};
和A类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方法。有没有其他的方式来操纵(设置)私有属性?即; AVLNode对象如何在不使用公共setter方法的情况下设置其私有属性?
自从我编写C++以来已经有一段时间了,但我相信你所说的概念是“朋友”。 http://yosefk.com/c++fqa/friend.html – Spidy
我不想使用朋友关系。请参阅最后一部分:问题的“编辑”。明确的问题写在那里。 –
你问是否有另一种方式,然后拒绝明显的答案。你希望二传手不公开,但你想要一个特权类来访问它。那是一位朋友。唯一的其他选择是在这种情况下没有意义的子分类。您还可以向设置者添加验证码以使其“更安全”。我认为你过于谨慎。如果有人添加了“恶意”的代码,那么他们破坏了代码,这就是问题 – Spidy