Вопрос о внутреннем классе C ++ - PullRequest
16 голосов
/ 22 апреля 2010

HI

В C ++ внутренний класс,

class A {
    public: 
         void f1();
    private:
         void f2();
    class B {
       private void f3(); 
    };

 }

Есть ли у внутреннего класса (B) указатель на его родительский класс (A)? (как это происходит в Java). И может ли B вызвать метод public / private своего родительского класса (как это происходит в Java).

Спасибо.

Ответы [ 3 ]

28 голосов
/ 22 апреля 2010

Нет - в C ++ вложенные классы влияют только на имена и видимость, а не на семантику самого класса. Что касается сгенерированного кода, то вложенный класс ничем не отличается от того, который не является вложенным.

Все, что изменилось, это видимость и имя (например, если он находится в разделе private: внешнего класса, он не виден внешнему миру, а если он находится в разделе public:, он виден, но ( конечно), чтобы назвать его, вы используете outer_class::inner_class. Хотя это все еще совершенно отдельный класс - например, вы можете создать экземпляр внутреннего класса без создания какого-либо экземпляра внешнего класса.

Редактировать: Извините, я пропустил часть вашего вопроса. В C ++ 0x внутренний класс имеет доступ к закрытым частям внешнего класса - по сути, внешний класс объявляет внутренний класс своим другом, поэтому частные имена видны, но вам все равно нужно передайте ему что-то вроде ссылки на объект внешнего класса, прежде чем он сможет вызывать любые нестатические функции-члены внешнего класса.

Хотя это еще не так, я считаю, что большинство компиляторов уже реализовали эту конкретную часть.

7 голосов
/ 22 апреля 2010

Нет, класс B не имеет указателя на класс A. Если вы явно не добавите его.

0 голосов
/ 22 апреля 2010

Есть ли у него указатель на родителя: №
Имеет ли он доступ к частным членам родителей: вроде

Я думаю, что если у него есть доступ, который не определен в стандарте, я могу ошибаться.
Но вы можете получить к нему доступ в g ++

#include <iostream>

class X
{
    class Y
    {
        public:
            Y(X* p)
                :parent(p)
            {}
            void TryY()
            {
                // Access a private member of X
                ++(parent->value);
            }

        private:
            X*  parent;
    };

    public:
        X()
            :y(this)
        {
            value = 4;
        }

        void TryY()
        {
            y.TryY();
            std::cout << value << std::endl;
        }
    private:
        Y   y;
        int value;

};

int main()
{
    X   x;
    x.TryY();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...