访问超类实例的受保护成员

时间:2017-10-11 12:42:09

标签: c++ inheritance

(编辑完整性)

我有两种结构:

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

2 个答案:

答案 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) - 建议不要这样做:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c129-when-designing-a-class-hierarchy-distinguish-between-implementation-inheritance-and-interface-inheritance