我正在通过EASTL's list class查看作者如何实现节点。我的期望是一个简单的类/结构。相反,我看到一个基础和一个继承自这个基础的节点(仍然过于简单,但为什么还有两个类?)。他的评论解释了原因:
我们与ListNode(下面)分开定义ListNodeBase,因为它允许 我们有非模板化的操作,如插入,删除(下面)和它 使得列表锚点节点不携带T,这样就可以了 由于存在额外的Ts,浪费空间并可能导致用户感到惊讶 用户没有明确创建。所有这一切的缺点是 考虑到节点指针的位置,它会使列表的调试查看更加困难 键入ListNodeBase而不是ListNode。但是,请参阅下面的ListNodeBaseProxy。
我在这里不了解一些事情。我做了解有关为什么它会使调试查看更加困难的部分,但list anchor node doesn't carry a T with it
和would waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create
是什么意思?
答案 0 :(得分:7)
如果没有辅助类,列表根节点将包含从未使用过的T实例。第二句话是说你可能不希望一个空列表创建一个T.例如,创建一个T可能有副作用。
答案 1 :(得分:1)
在我看来,这个想法是将列表的抽象与它携带的数据分开。当您真正想要访问数据时,您只需要ListNode
,其余所有内容都可以在摘要ListNodeBase
上完成。这就是我理解list anchor node doesn't carry a T with it
。
那里有关于空间的东西。模板类是按类型创建的,所以如果你有几种不同的类型用于T
,没有ListNodeBase
你会创建每种类型的所有操作的模板副本,用它 - 你没有,并且LinkNode
继承了它们,并且只需要实际数据的内存。似乎节省的空间是指在这种情况下代码的实际大小。
答案 2 :(得分:1)
你真的想支持空列表。如果头节点本身总是包含一个T,并且每个列表都包含一个头节点,那么每个列表至少包含一个T,因此永远不会为空。