2014-03-19 36 views
0

给出一个包含有一个树的节点描述的一类称为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方法的情况下设置其私有属性?

+0

自从我编写C++以来已经有一段时间了,但我相信你所说的概念是“朋友”。 http://yosefk.com/c++fqa/friend.html – Spidy

+0

我不想使用朋友关系。请参阅最后一部分:问题的“编辑”。明确的问题写在那里。 –

+0

你问是否有另一种方式,然后拒绝明显的答案。你希望二传手不公开,但你想要一个特权类来访问它。那是一位朋友。唯一的其他选择是在这种情况下没有意义的子分类。您还可以向设置者添加验证码以使其“更安全”。我认为你过于谨慎。如果有人添加了“恶意”的代码,那么他们破坏了代码,这就是问题 – Spidy

回答

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工作,但这些方法会暴露只是只读版本:AVLNode。

+0

如果我在AVLTree中定义struct AVLNode,那么问题也没有解决。 AVLTree对象可以通过使用struct AVLNode类型变量来访问左,右,键等属性来访问公共方法内的AVLNode的属性。我关心的是遏制对属性的访问。仔细查看问题的最后部分('编辑')部分。 –

+0

看到我修改的代码。 – ebasconp

0

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

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

我不需要AVLTree成为AVLNode的朋友类。我只想知道是否有任何可能的方法可以帮助我的应用程序让AVLNodes不使用公共setter方法直接修改私有属性。简单地说,我不想使用公共setter方法。有没有其他的方式来操纵(设置)私有属性? –

+1

您可以将该成员公开,编写一个修改该值的方法或声明该类的朋友。这就是语言的工作原理。我没有看到你想要完成的事情。 – Aesthete

+0

是的,我确实已经这样做了 - 我已经定义了一些修改私有属性的公共setter方法。参考你可以看到AVLNode类。但是,如果引入任何漏洞,易受攻击的代码可以调用任何可用的对象的任何setter方法[考虑最坏的情况],但使用公共setter方法可能会使程序不一致,正如您在'rotateRight'方法中看到的那样。这就是为什么我问是否有其他可行的方式。我也不知道有没有。 –