这是我写的一个双向链表类:
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_next
在 Node
上课,一切正常……或者我认为。我的问题是:正如我们在这里看到的那样,一个函数能否成为多个类的 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/