gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:02:38 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com