簡體   English   中英

為什么我的朋友類不能訪問私有成員?

[英]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;
    }
}
  1. 您發布的描述表明您的代碼編譯成功。 在這種情況下,您在問題標題中談論的是什么私人訪問問題? C++ 中的訪問控制是一個純粹的編譯時概念。 如果您的代碼編譯成功,那么私有訪問就沒有問題。

  2. 您的類模板OULinkedListEnumeratorOULinkedList類模板中的嵌套類模板。 就像任何嵌套類一樣,它應該擁有對封閉類模板OULinkedList私有成員的完全訪問權限,而無需OULinkedList聲明。

  3. 以防萬一,當您為未知實體進行友元聲明時,假定該實體是封閉命名空間范圍的成員。 所以你的

    template <typename F> friend class OULinkedListEnumerator;

    引用全局類模板::OULinkedListEnumerator並使其成為朋友。 稍后您聲明一個嵌套類模板OULinkedList::OULinkedListEnumerator 這是一個完全不同的類模板。 它不是朋友。 (但它不一定是,見 2)。

  4. 不允許在嵌套模板聲明中重復使用模板參數名稱。 您必須將嵌套模板參數的名稱從T更改為其他名稱。 事實上,我很驚訝你設法將代碼編譯到一些所謂的“訪問問題”點,而沒有先解決這個參數命名問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM