我一直发现自己想要以正确的方式做事。但是,我对数据封装有点困惑(不是它的原理,而是如何在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引用,该怎么办?
答案 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容器并停止使用数组。)