我一直对关于指针的正确封装感到困惑,有人可以看看吗?

时间:2013-05-11 10:37:18

标签: c++ pointers encapsulation

我一直发现自己想要以正确的方式做事。但是,我对数据封装有点困惑(不是它的原理,而是如何在C ++中正确地完成)

假设我有以下课程:

template <class T, class Alloc = std::allocator<T> >
class Tree
{
public:
    class Node
    {
    public:
        T data;

        Node** get_children() const { return children; }
        Node*  get_parent() const { return parent; }
        Node*  get_right() const { return right; }

        friend class Tree;

    private:
        Node** children;
        Node*  parent;
        Node*  right;
    };

    // typedefs for STL ...

    class iterator // linear iterator
    {
        // ...
    };

    class const_iterator // linear iterator
    {
        // ...
    };

    // Tree operations ...

private:
    Node root;
};

我希望树能够自由地修改节点的结构,所以我把它作为节点的朋友类。

我还希望用户能够以树的形式遍历树(而不是使用树结构进行幕后存储,只是让用户线性迭代它)。

数据应该可以自由修改。如果树对象的所有者不希望其他用户修改其内容,则可以传递const引用。

现在我想知道我的getter方法的返回类型。无论发生什么,我都不希望用户能够直接更改节点的结构信息。树应始终是修改私有成员的树。这段代码能保证吗?如果不是Node**,我们保存std::vector<Node*>并返回对向量的const引用,该怎么办?

1 个答案:

答案 0 :(得分:0)

这两个是安全的:

Node*  get_parent() const { return parent; }
Node*  get_right() const { return right; }

由于这些函数按值返回指针,因此用户无法修改成员变量。

这个是不安全的:

Node** get_children() const { return children; }

这也会按值返回一个指针,这样用户就无法修改children,但是用户可以修改数组中的元素,我认为这些元素是指向子元素的指针。以下是如何确保安全:

Node * const * get_children() const { return children; }

(当你准备好了,你可以前进到STL容器并停止使用数组。)