(为完整性而编辑)
我有两个结构:
struct DoubleLinkedList: public LinkedList {
void push(IntEntry entry) override;
IntEntry pop(int key) override;
protected:
DoubleLinkedList *m_previous;
};
struct LinkedList {
virtual void push(IntEntry entry);
virtual IntEntry pop(int key);
protected:
IntEntry m_entry;
LinkedList* m_next;
};
在
IntEntry DoubleLinkedList::pop(int key)
定义中,我正在尝试访问m_next->m_entry
,这给我一个错误'm_entry' is a protected member of 'LinkedList'
。IntEntry DoubleLinkedList::pop(int key) {
if (m_next->m_value.key == key) {
(...)
} else {
(...)
}
}
从
m_next->m_entry
访问IntEntry LinkedList::pop(int key)
时这不是问题。有没有一种方法可以在不将
DoubleLinkedList
定义为LinkedList
定义的 friend 类的情况下访问 protected 成员?在这种情况下,我根本不想让LinkedList
知道DoubleLinkedList
。 最佳答案
您已经做过static_cast<DoubleLinkedList*>(...m_next)
,这是处理它的一种方法-static_cast<DoubleLinkedList*>(m_next)->m_entry
。这种转换有点危险,因为如果LinkedList插入一个LinkedList元素作为m_next,它将破坏该转换。
该问题的原因是您在混合实现(查找,查看)和接口(interface)继承(推送,弹出)-建议不要这样做:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c129-when-designing-a-class-hierarchy-distinguish-between-implementation-inheritance-and-interface-inheritance