关于C ++内部类的问题

时间:2010-04-22 00:53:18

标签: c++

HI,

在C ++内部类中,

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

 }

内部类(B)是否有指向其父类(A)的指针? (就像在Java中一样)。 并且B可以调用其父类的公共/私有方法(就像在Java中一样)。

谢谢。

3 个答案:

答案 0 :(得分:28)

否 - 在C ++中,嵌套类只影响名称和可见性,而不影响类本身的语义。就生成的代码而言,嵌套类与未嵌套的类没有区别。

所有改变的是可见性和名称(例如,如果它在外部类的private:部分中,它对外部世界是不可见的,如果它在public:部分中,则是可见,但(当然)命名它使用outer_class::inner_class。它仍然是一个完全独立的类 - 例如,您可以创建内部类的实例而无需创建外部类的任何实例。 / p>

编辑:对不起,我错过了你的部分问题。在C ++ 0x中,内部类可以访问外部类的私有部分 - 实质上,就好像外部类已经将内部类声明为其朋友,因此私有名称是可见的,但是您仍然需要在它可以调用外部类的任何非静态成员函数之前,将它传递给类外部对象的引用。

虽然事实并非如此,但我相信大多数编译器已经实现了这一特定部分。

答案 1 :(得分:7)

不,B类没有指向A类的指针,除非您明确添加它。

答案 2 :(得分:0)

是否有指向父母的指针:不。
它是否可以访问父母私人成员:排序

我认为如果它有访问权限在标准中没有明确定义我可能是错的。
但你可以用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();
}