(编辑完整性)
我有两种结构:
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
朋友类?如我所知,我不想LinkedList
完全了解DoubleLinkedList
。
答案 0 :(得分:1)
确保首先修复编译器报告的第一个错误,一次移动一个错误。我尝试编译代码时遇到的错误是
' m_value' :不是' LinkedList'
的成员
在线
if (m_next->m_value.key == key)
PS。我必须定义一个虚拟
后,我收到此错误struct IntEntry
{
static IntEntry empty() { return IntEntry(); };
};
如果您想要更多有用的回复,请发布complete and verifiable代码,正如其他人所说。
答案 1 :(得分:1)
您已经static_cast<DoubleLinkedList*>(...m_next)
这是处理它的一种方式 - 即static_cast<DoubleLinkedList*>(m_next)->m_entry
。该转换有点危险,因为如果LinkedList将LinkedList元素作为m_next插入,则会破坏该转换。
问题的原因是你混合了实现(find,Peek)和接口继承(push,pop) - 建议不要这样做: