Подтвердить что ты не робот

Вопрос о внутреннем классе С++

HI,

В внутреннем классе С++

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

 }

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Есть ли указатель на родителя: Нет. Имеет ли он доступ к закрытым членам родителей: Тип

Я думаю, что если у него есть доступ, он не совсем определен в стандарте, я могу ошибаться.
Но вы можете получить к нему доступ в 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();
}