[英]Why can't my friend class access a private member?
我想当一个类声明一个朋友类时,朋友可以访问声明者的私有成员? 情况似乎并非如此,或者我做错了什么。 我正在尝试访问 OULinkedList 中的“第一个”或“最后一个”。 当我尝试使用“第一个”或“最后一个”时,出现“未在此范围内声明”错误。
我需要访问“first”,因为没有它我的下一个函数将永远不会返回链表的第一个值,我不知道怎么做。
例如,如果我只想打印出列表中的对象,那么下面的 while 循环总是会跳过第一个对象。
while(enumerator.hasNext()){
cout << enumerator.next();
}
这显然不是我想要的。
#include "OULink.h"
#include "Comparator.h"
#include "OULinkedListEnumerator.h"
// OULinkedList stands for Ordered, Unique Linked List. It is a linked list that is always maintained in
// order (based on the comparator provided to it when the list is created) and that only contains unique
// items (that is, duplicates are not allowed)
template <typename T>
class OULinkedList {
template <typename F>
friend class OULinkedListEnumerator;
private:
Comparator<T>* comparator = NULL; // used to determine list order and item equality
unsigned long size = 0; // actual number of items currently in list
OULink<T>* first = NULL; // pointer to first link in list
OULink<T>* last = NULL;
template <typename T>
class OULinkedListEnumerator : public Enumerator<T>
{
private:
OULink<T>* current;
int firstNode = 0;
public:
OULinkedListEnumerator(OULink<T>* first);
bool hasNext() const;
T next();
T peek() const;
};
// Implementation goes here
template<typename T>
OULinkedListEnumerator<T>::OULinkedListEnumerator(OULink<T>* first){
this->current = first;
}
template<typename T>
bool OULinkedListEnumerator<T>::hasNext() const{
if(this->current->next != NULL){
return true;
}else{
return false;
}
}
template<typename T>
T OULinkedListEnumerator<T>::next(){
T successorNode = *this->current->next->data;
this->current = this->current->next;
return successorNode;
}
template<typename T>
T OULinkedListEnumerator<T>::peek() const{
if(current != NULL){
return *current->data;
}else{
throw new ExceptionLinkedListAccess;
}
}
您发布的描述表明您的代码编译成功。 在这种情况下,您在问题标题中谈论的是什么私人访问问题? C++ 中的访问控制是一个纯粹的编译时概念。 如果您的代码编译成功,那么私有访问就没有问题。
您的类模板OULinkedListEnumerator
是OULinkedList
类模板中的嵌套类模板。 就像任何嵌套类一样,它应该拥有对封闭类模板OULinkedList
私有成员的完全访问权限,而无需OULinkedList
声明。
以防万一,当您为未知实体进行友元声明时,假定该实体是封闭命名空间范围的成员。 所以你的
template <typename F> friend class OULinkedListEnumerator;
引用全局类模板::OULinkedListEnumerator
并使其成为朋友。 稍后您声明一个嵌套类模板OULinkedList::OULinkedListEnumerator
。 这是一个完全不同的类模板。 它不是朋友。 (但它不一定是,见 2)。
不允许在嵌套模板声明中重复使用模板参数名称。 您必须将嵌套模板参数的名称从T
更改为其他名称。 事实上,我很惊讶你设法将代码编译到一些所谓的“访问问题”点,而没有先解决这个参数命名问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.