[英]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.