当前位置:  开发笔记 > 编程语言 > 正文

内部类可以访问私有变量吗?

如何解决《内部类可以访问私有变量吗?》经验,为你挑选了3个好方法。

内部类是在其中定义的类的朋友.
所以,是的; 类型的对象Outer::Inner可以访问成员变量var类型的对象的Outer.

但与Java不同,类型Outer::Inner对象与父类对象之间没有相关性.您必须手动创建父子关系.

#include 
#include 

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::string a = "myconst1";
                std::cout << parent.var << std::endl;

                if (a == MYCONST)
                {   std::cout << "string same" << std::endl;
                }
                else
                {   std::cout << "string not same" << std::endl;
                }
            }
        private:
            Outer&  parent;
    };

    public:
        Outer()
            :i(*this)
            ,var(4)
        {}
        Outer(Outer& other)
            :i(other)
            ,var(22)
        {}
        void func()
        {
            i.func();
        }
    private:
        static const char* const MYCONST;
        Inner i;
        int var;
};

const char* const Outer::MYCONST = "myconst";

int main()
{

    Outer           o1;
    Outer           o2(o1);
    o1.func();
    o2.func();
}

C + 11标准现在符合以上描述. (19认同)

从技术上讲,在当前的C++标准中,嵌套类没有对其封闭类的特殊访问权限.见标准的第11.8.1节.但是,另见这个标准缺陷:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45 (11认同)

@Loki Astari:我读了最后一句"你必须手动创建父子关系"并解释后面的代码片段,作为如何正确执行__rectly_的示例! (3认同)


MSN.. 28

内部类可以访问外部类的所有成员,但它没有对父类实例的隐式引用(与Java的一些奇怪之处不同).因此,如果将对外部类的引用传递给内部类,它可以引用外部类实例中的任何内容.



1> Martin York..:

内部类是在其中定义的类的朋友.
所以,是的; 类型的对象Outer::Inner可以访问成员变量var类型的对象的Outer.

但与Java不同,类型Outer::Inner对象与父类对象之间没有相关性.您必须手动创建父子关系.

#include 
#include 

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::string a = "myconst1";
                std::cout << parent.var << std::endl;

                if (a == MYCONST)
                {   std::cout << "string same" << std::endl;
                }
                else
                {   std::cout << "string not same" << std::endl;
                }
            }
        private:
            Outer&  parent;
    };

    public:
        Outer()
            :i(*this)
            ,var(4)
        {}
        Outer(Outer& other)
            :i(other)
            ,var(22)
        {}
        void func()
        {
            i.func();
        }
    private:
        static const char* const MYCONST;
        Inner i;
        int var;
};

const char* const Outer::MYCONST = "myconst";

int main()
{

    Outer           o1;
    Outer           o2(o1);
    o1.func();
    o2.func();
}


C + 11标准现在符合以上描述.
从技术上讲,在当前的C++标准中,嵌套类没有对其封闭类的特殊访问权限.见标准的第11.8.1节.但是,另见这个标准缺陷:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45
@Loki Astari:我读了最后一句"你必须手动创建父子关系"并解释后面的代码片段,作为如何正确执行__rectly_的示例!

2> MSN..:

内部类可以访问外部类的所有成员,但它没有对父类实例的隐式引用(与Java的一些奇怪之处不同).因此,如果将对外部类的引用传递给内部类,它可以引用外部类实例中的任何内容.


从c ++ 11开始就是如此

3> Mark Ransom..:

任何属于 Outer的东西都应该可以访问所有Outer的公共或私人成员.

编辑:你的编译器是正确的,var不是Inner的成员.但是如果你有一个引用或指向Outer实例的指针,它就可以访问它.


Outer的东西都应该可以访问所有Outer的公共或私人成员.
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有