2017-05-27 2 views
1

Ich habe eine queue.h Datei wie folgt.Zugriff auf einen geschützten/privaten geschachtelten Klassenzeiger von einem Mitglied

Ist es möglich, dass ich auf den Kopfzeiger der Warteschlange von Main zugreifen kann?

Wenn ja, was soll ich in main tun?

Da der Kopfzeiger ein Klassenzeiger ist und sein Typ eine geschützte geschachtelte Klasse ist, glaube ich nicht, dass ich von main aus darauf zugreifen kann.

Daher versuche ich eine Funktion getHead() als öffentliches Mitglied zu erstellen. Allerdings kommt ein anderes Problem, ich verwende Template-Klasse. Bitte führe mich, wie ich dieses Problem lösen kann.

meine Header-Datei:

#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 

mein Haupt ist:

#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

Wenn Sie Node zu einer geschützten Klasse machen, können Sie Node * nicht außerhalb der Klasse haben. Machen Sie die Klassendefinition also öffentlich und lassen Sie die Mitglieder (wie Kopf, Schwanz, Anzahl) noch privat. Dann könntest du Node * getHead() {return head; } – Gerriet

+1

@Gerriet _ "Wenn Sie Node zu einer geschützten Klasse machen, können Sie Node * nicht außerhalb der Klasse haben." _ Wrong. Siehe meine Antwort. –

+1

Beachten Sie auch, dass "using Namespace std" als schlechte Praxis in Header-Dateien gilt: https://stackoverflow.com/questions/1452721/why-isusing-namespace-std-considered-bad-practice – Gerriet

Antwort

2

Um myQueue::Node Acess von außerhalb der Klasse, die Sie Ihre Getter-Funktion ein wenig umschreiben müssen:

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

Dann können Sie es in main() wie diesem

verwenden
auto head = queue.getHead(); 

Beachten Sie, dass die Verwendung von auto in diesem Fall wichtig ist. Sie können immer noch keine Variable des Typs myQueue<T>::Node oder myQueue<T>::Node** außerhalb von myQueue<T> deklarieren, aber Sie können Variablen verwenden, um diese Typen zu speichern.

+0

löschte meine Antwort, da es das gleiche ist. –

Verwandte Themen