2009-09-09 4 views
7

Ich habe vor kurzem eine Frage gestellt about accessing the underlying container of STL adapters. Ich habe eine sehr hilfreiche Antwort:Ich kann diese Zeile nicht verstehen - Dereferenzierung einer Adresse der privaten Mitgliedsvariablen oder was?

template <class T, class S, class C> 
    S& Container(priority_queue<T, S, C>& q) { 
     struct HackedQueue : private priority_queue<T, S, C> { 
      static S& Container(priority_queue<T, S, C>& q) { 
       return q.*&HackedQueue::c; 
      } 
     }; 
    return HackedQueue::Container(q); 
} 

int main() 
{ 
    priority_queue<SomeClass> pq; 
    vector<SomeClass> &tasks = Container(pq); 
    return 0; 
} 

Leider konnte ich nicht verstehen, diese Zeile:

return q.*&HackedQueue::c; 

Was bedeutet diese Linie tun? Wie könnte diese Zeile auch auf den privaten Container in priority_queue zugreifen, der an die Funktion Container übergeben wird?

+0

@curtisk Dank meinen Titel für die Korrektur :) – AraK

+0

Ich denke, man könnte meinen über etwas sarkastisch „versteckte Features von C++“ Eintrag lesen möchten: http://stackoverflow.com/questions/75538/hidden-features-of- c/1065606 # 1065606 :) –

+0

@Alcon, Man meine Antwort war nicht wirklich gut, ich zog es vor, es zu löschen, ich schätze es Mann :) – AraK

Antwort

12

Betrachten Sie es wie folgt aus:

(q).*(&HackedQueue::c); 

Zuerst müssen Sie HackedQueue :: c, die nur der Name eines Mitglieds variabel ist. Dann nehmen Sie & HackedQueue :: c, die ein Zeiger auf diese Elementvariable ist. Als nächstes nehmen Sie q, die nur eine Objektreferenz ist. Dann verwenden Sie den Operator "Zeiger auf Element nach Referenz binden" .*, um die Elementvariable zu binden, auf die sich der Membervariable-Zeiger unter Verwendung von q als das this bezieht.

In Bezug auf das private Mitglied Problem, priority_queue::c ist nur geschützt, nicht privat, so sollte es nicht überraschen, dass, wenn Sie von priority_queue ableiten, dass Sie auf seine geschützten Mitglieder zugreifen können.

+0

Danke, aber 'c' ist eine Membervariable. Welches ist der Container innerhalb der std :: priority_queue? – AraK

+0

Entschuldigung, ja. Es ist eine Member-Variable, aber die Bindung an Member-Operator ist immer noch die gleiche (wie '.' Wird für beide Aufträge verwendet. – Eclipse

+0

Schöne Erklärung +1 – AraK

Verwandte Themen