0

我不断发现自己想要以正确的方式做事™。但是,我对数据封装有点困惑(不是它的原理,而是如何在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**我们保存 astd::vector<Node*>并返回对向量的 const 引用而不是 a 怎么办?

4

1 回答 1

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 容器并停止使用数组。)

于 2013-05-11T10:56:22.907 回答