вложение классов и структур - PullRequest
4 голосов
/ 28 марта 2012

Мне не очень понятен этот код

внешнее - это class, а внутреннее - struct, кто-нибудь может мне помочь объяснить это?

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;
    }
};

мой вопроссосредоточить внимание на первых нескольких строках

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

Какое отношение между class Stack и struct Link?

Ответы [ 3 ]

6 голосов
/ 28 марта 2012

Link объявлено внутри Stack, и, поскольку оно private по умолчанию, его нельзя использовать вне класса.

Кроме того, Stack имеет член head, который имеет тип Link*.

Единственная разница между class и struct заключается в уровне доступа по умолчанию - public для структуры и private для класса, поэтому не позволяйте "объявленной внутри класса структуре" сбить вас с толку. Кроме уровня доступа, он такой же, как «класс, объявленный внутри класса» или «структура, объявленная внутри структуры».

5 голосов
/ 28 марта 2012

Класс Stack и структура Link являются вложенными .
Обратите внимание, что у вложенных классов есть определенные ограничения в отношении доступа к элементам вложенного и включающего класса.

Поскольку Link объявлен в private спецификаторе доступа в классе Struct, он не доступен вне класса Struct.

1 голос
/ 28 марта 2012

Struct Link внутренне объявлено в классе (правильный термин вложен). Доступ к нему можно получить только в классе (из-за уровня закрытого доступа по умолчанию). Структура могла бы быть указана с Stack::Link, если бы она была объявлена ​​общедоступной.

Причиной такого объявления в этом случае является то, что только внутренние методы класса должны использовать ссылки, а struct обеспечивает лучшую организацию кода. Однако, пока никакой другой класс не должен обращаться к struct, такое объявление обеспечивает лучшую инкапсуляцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...