C++:让多个类成为函数的 friend ?

标签 c++ oop friend friend-function

这是我写的一个双向链表类:

template <class T>
class DLL
{
    class Node
    {
        T m_data;
        Node* m_prev;
        Node* m_next;

        Node(const T& data) :m_data{ data }, m_prev{ nullptr }, m_next{ nullptr }{}

        friend class DLL;

        friend std::ostream& operator<<(std::ostream& out, const Node& node)
        {
            out << node.m_data;
            return out;
        }
    };

    Node* m_first = nullptr;

public:
    DLL& add(const T& data)
    {
        Node* temp = new Node{ data };

        if (m_first)
        {
            temp->m_next = m_first;
            m_first->m_prev = temp;
            m_first = temp;
        }
        else {
            m_first = temp;
        }
        return *this;
    }

    friend std::ostream& operator<<(std::ostream& out, const DLL& dll)
    {
        Node* trav = dll.m_first;
        while (trav)
        {
            out << *trav << ' ';
            trav = trav->m_next; //C2248: Cannot access private member declared in class DLL::Node.
        }
        return out;
    }

    ~DLL()
    {
        Node* trav = m_first->m_next;
        Node* foll = m_first;

        while (trav)
        {
            delete foll;
            foll = trav;
            trav = trav->m_next;
        }
        delete foll;
    }
};

DLL的友元函数输出 DLL进入流,弹出一个错误,说函数无法访问类的私有(private)成员 Node .

经过几次尝试,我想出了一个解决方案,将这个 friend 函数声明为 Node 的 friend 。类如下所示:
class Node
    {
        T m_data;
        Node* m_prev;
        Node* m_next;

        Node(const T& data) :m_data{ data }, m_prev{ nullptr }, m_next{ nullptr }{}

        friend class DLL;

        friend std::ostream& operator<<(std::ostream& out, const Node& node)
        {
            out << node.m_data;
            return out;
        }

        friend std::ostream& operator<<(std::ostream& out, const DLL& dll);
    };

现在函数 std::ostream& operator<<(std::ostream& out, const DLL& dll)可以访问m_nextNode上课,一切正常……或者我认为。

我的问题是:正如我们在这里看到的那样,一个函数能否成为多个类的 friend ,或者我所做的是否会调用未定义的行为?

最佳答案

是的,一个函数可以是多个类的 friend 。

但是 friend 不是继承的,所以即使operator<<DLL<T> 的 friend 和 DLL<T> DLL<T>::Node 的 friend ,它不会自动生成 operator<< DLL<T>::Node 的 friend ,因此无法访问 private DLL<T>::Node::m_next .

解决方案是将其声明为 DLL<T>::Node 的 friend ,就像你做的那样。

关于C++:让多个类成为函数的 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61850702/

相关文章:

友元函数的 C++ 内联定义

c++ - 在下面的程序中,如何在 findLowest 函数中显示事故次数最少的地区的名称?

c++ - 复制对类成员资源的引用

sql - 如何用面向对象的 Perl 组装 SQL?

c++ - 可以为了速度牺牲常量正确性吗?

c++ - 如何使用 C++ 中的友元函数将成员变量从一个类访问到另一个类?

c++ - 在 Windows 中检测全屏模式

c++ - 如何使用 CGAL 简化 3d 网格的特定区域

oop - 用例图 : Does an included use case have to be triggered by the base use case?

c++ - 在类模板中没有定义参数的情况下调用 friend 模板函数