【发布时间】:2021-09-16 14:23:02
【问题描述】:
所以我在 c 和 c++ 中的数据结构和算法中看到了这个代码片段:
class DLinkedList { // doubly linked list
public:
DLinkedList(); // constructor
~DLinkedList(); // destructor
bool empty() const; // is list empty?
const Elem& front() const; // get front element
const Elem& back() const; // get back element
void addFront(const Elem& e); // add to front of list
void addBack(const Elem& e); // add to back of list
void removeFront(); // remove from front
void removeBack(); // remove from back
private: // local type definitions
DNode* header; // list sentinels
DNode* trailer;
protected: // local utilities
void add(DNode* v, const Elem& e); // insert new node before v
void remove(DNode* v); // remove node v
};
我的问题是:为什么成员函数 add() 和 remove() protected (以及何时应该使用关键字 protected)
编辑:DNode 在这里定义:
typedef string Elem; // list element type
class DNode { // doubly linked list node
private:
Elem elem; // node element value
DNode* prev; // previous node in list
DNode* next; // next node in list
friend class DLinkedList; // allow DLinkedList access
};
【问题讨论】:
-
也许作者想在后面的章节中使用继承。受保护的成员可以被派生的孩子使用。根据en.cppreference.com/w/cpp/language/access:“受保护的继承:在访问说明符之后列出的基类的公共和受保护成员是派生类的受保护成员,而派生类无法访问基类的私有成员”
-
它们是辅助函数(不打算成为 API 的一部分;你可以知道,因为它们处理节点指针),但为什么它们受到保护而不是私有是一个只有作者的谜可以帮到你。
-
我们喜欢 cmets,不是吗?
-
关于什么属于公共 API 和什么受保护的决定可能是一个主观的设计决定。您是在让我们猜测作者的设计,并且没有太多信息可以继续。我最好的猜测是答案在于
DNode(这些受保护成员使用)和Elem(一些公共成员使用)的定义。是否可以提供更多上下文而不会陷入压倒性的代码转储?
标签: c++ linked-list doubly-linked-list