我不断发现自己想要以正确的方式做事™。但是,我对数据封装有点困惑(不是它的原理,而是如何在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 怎么办?