(为完整性而编辑)

我有两个结构:

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

10-05 23:56