2012-03-28 12 views
4

Ich bin nicht ganz klar diesen CodeKlasse und struct Verschachtelung

Außen ist ein class und die innere ein struct, kann mir das erklären jemand helfen?

class Stack { 
    struct Link { 
     void* data; 
     Link* next; 
     Link(void* dat, Link* nxt): 
     data(dat),next(nxt) {} 
    }* head; 
public: 
    Stack():head(0) {} 
    ~Stack() { 
     require(head==0,"Stack not empty"); 
    } 
    void push(void* dat) { 
     head = new Link(dat, head); 
    } 
    void peek() const { 
     return head ? head->data : 0; 
    } 

    void* pop() { 
     if(head == 0) return 0; 
     void* result = head->data; 
     Link* oldHead = head; 
     head = head->next; 
     delete oldHead; 
     return result; 
    } 
}; 

meine Frage ist auf den ersten Zeilen konzentrieren

class Stack { 
    struct Link { 
     void* data; 
     Link* next; 
     Link(void* dat, Link* nxt): 
     data(dat),next(nxt) {} 
    }* head; 

, was die Beziehung zwischen class Stack und struct Link?

Antwort

5

Link ist innerhalb Stack deklariert, und da es standardmäßig private ist, kann es nicht außerhalb der Klasse verwendet werden.

Auch hat Stackhead ein Mitglied, das von Link* Typ ist.

Der einzige Unterschied zwischen class und struct ist die Standard-Zugriffsebene - public für Struktur und private für Klasse, so lassen Sie sich nicht „innerhalb einer Klasse deklariert Struktur“ Sie verwirren. Anders als die Zugriffsebene ist dies dasselbe wie "innerhalb einer Klasse deklarierte Klasse" oder "in einer Struktur deklarierte Struktur".

+0

Der Unterschied zwischen 'class' &' struct' ist auch im Falle von Vererbung von Bedeutung.Inheritance ist 'private' standardmäßig bei Klassen, während es bei Strukturen 'public' ist. –

+0

@Als ist das nicht ein Nebeneffekt der Zugriffsebene innerhalb der Klasse? –

+0

* [Seiteneffekt] (http://en.wikipedia.org/wiki/Side_effect_ (computer_science)) *? Warum? Wie? –

4

Klasse Stack und struct Link sind nested.
Beachten Sie, dass geschachtelte Klassen bestimmte Einschränkungen hinsichtlich des Zugriffs auf Elemente der geschachtelten und der einschließenden Klasse haben.

Da Link unter private Zugriffsbezeichner in Klasse deklariert ist Struct es kann nicht Struct außerhalb der Klasse zugegriffen werden.

1

Struct Link ist inner-deklariert in der Klasse (der richtige Begriff ist verschachtelt). Es kann nur in der Klasse zugegriffen werden (aufgrund seiner standardmäßigen privaten Zugriffsebene). Die Struktur könnte mit Stack::Link bezeichnet worden sein, wenn sie öffentlich bekannt wurde.

Der Grund für eine solche Deklaration in diesem Fall ist, dass nur die inneren Methoden der Klasse die Links verwenden müssen und struct eine bessere Codeorganisation bietet. Solange jedoch keine andere Klasse auf die struct zugreifen muss, bietet eine solche Deklaration eine bessere Kapselung.

Verwandte Themen