2017-05-27 73 views
1

我有一個如下所示的queue.h文件。如何從成員訪問受保護/私有嵌套類指針

我可以從Main中訪問隊列的頭指針嗎?

如果是,我應該怎麼做?

由於頭指針是一個類指針,它的類型是一個受保護的嵌套類,我不認爲我可以從main訪問它。

因此,我嘗試創建一個函數getHead()作爲公共成員。然而,另一個問題來了,它是我使用模板類。請指導我如何解決這個問題。

我的頭文件:

#include <iostream> 
#include <iomanip> 
using namespace std; 

class PCB 
{ 
    public: 
     int PID; 
     string fileName; 
};  

template<class T> 
class myQueue 
{ 
    protected: 
     class Node 
     { 
      public: 
       T info; 
       Node *next; 
       Node *prev; 
     }; 

     Node *head; 
     Node *tail; 
     int count; 

    public: 
     void getHead(Node **tempHead); 
}; 

template<class T> 
void myQueue<T>::getHead(Node **tempHead) 
{ 
    *tempHead = head; 
}  
#endif 

我主要是:

template<class T> 
myQueue<T>::Node* myQueue<T>::getHead() 
{ 
    return head; 
} 

#include "myQueue.h" 
#include <iostream> 

int main() 
{ 
    myQueue<PCB> queue; 
    //How can I access the Head pointer of my Queue here? 
    //queue.getHead(&tempHead); 
    return 0; 
} 
+0

如果您將Node設爲受保護的類,那麼您將無法在類之外獲得Node *。因此,請將班級定義公開,並且可以讓成員(如頭,尾,數)仍然是私人的。然後你可以做Node * getHead(){return head; } – Gerriet

+1

@Gerriet _「如果您將Node設置爲受保護的類,那麼您將無法在類之外獲得Node * _錯誤。看到我的答案。 –

+1

另請注意,「使用namespace std」在頭文件中被認爲是不好的做法:https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – Gerriet

回答

2

要從你需要重寫你的getter函數有點類的外部接取myQueue::Node那麼你可以在main()這樣使用它

auto head = queue.getHead(); 

請注意,在這種情況下,auto的用法很重要。您仍然無法在myQueue<T>之外聲明myQueue<T>::NodemyQueue<T>::Node**類型的任何變量,但可以使用auto變量來保存這些類型。

+0

刪除了我的答案,因爲它是相同的。 –