给定一个名为 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/