Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;嵌套类可访问性_C++_Oop - Fatal编程技术网

C++ C++;嵌套类可访问性

C++ C++;嵌套类可访问性,c++,oop,C++,Oop,给出以下代码,但不考虑两个类之间的友谊: class OutSideClass { ... public: int i_pub; protected: int i_pro; private: int i_pri; class InSideClass { ... public: int j_pub; protected: int j_pro; p

给出以下代码,但不考虑两个类之间的友谊

class OutSideClass
{
...
public:
    int i_pub;
protected:
    int i_pro;
private:
    int i_pri;

    class InSideClass
    {
        ...
        public:
            int j_pub;
        protected:
            int j_pro;
        private:
            int j_pri;
    };
};
问题1>OutSideClass是否真的只能访问InSideClass的公共成员

问题2>InSideClass是否可以访问OutSideClass的所有成员


如果我的理解不正确,请更正。

嵌套类对封闭类没有特殊访问权限

问题1>OutSideClass是否真的只能访问InSideClass的公共成员

问题2>InSideClass是否可以访问OutSideClass的所有成员

不,在C++03中。是的,在C++11中


标准文本对此非常清楚:

C++标准(2003)在$118/1[类.Access .Nest ]中表示,

嵌套类的成员对 封闭类,也不适用于已授予 对封闭班级的友谊;通行规则(第11条) 必须服从封闭类的成员没有特殊的 访问嵌套类的成员;通常的访问规则(第条) 11) 必须遵守。

然而,标准报价有一个缺陷。它表示嵌套类无权访问封闭类的私有成员。但是在C++11中,它被纠正了:在C++11中,嵌套类确实可以访问封闭类的私有成员(尽管封闭类仍然不能访问嵌套类的私有成员)

请参阅此缺陷报告:


C++中所有嵌套类都将内部类放在外部类的命名空间中。要从OutSideClass的成员函数实例化InSideClass的实例,我只需要

InSideClass *instance = new InSideClass();
如果InsideClass是公共的,并且我想从不是OutSideClass成员的函数实例化InsideClass,我会键入:

OutSideClass::InSideClass *instance = new OutSideClass::InSideClass();
与Java等其他语言不同,InSideClass和OutSideClass在其他方面是完全独立的。

As@Nawaz,在C++03中,嵌套类对封闭类的成员没有特殊的访问权限。但是,通过将嵌套类声明为友元,很容易绕过此限制

class OutSideClass
{
...

    class InSideClass
    {
        ...
    };
    friend class InSideClass;
};

根据你的答案,我的答案似乎是最新的C++标准。是(在C++0x标准中)。:-)哪一个是最新的?C++03或C++0x?@q0987:C++0x是最新版本。C++ 03是指C++语言在2003中的标准化。因此,C++0x最喜欢C++11,因为今年它将发布。正如其他地方提到的,对于C++11,这并不是他们所做的全部。嵌套类还被隐式授予
friend
对封闭类的访问权。这是从C++11开始编写的,但我认为在此之前,各种编译器都非正式地完成了这项工作。似乎当我这样做时,InSideClass无法通过名称引用OutSideClass的成员变量?@OrangeSherbet你能创建一个显示问题的实例吗?我知道你现在谈论的是C++03。我还看到问题只是关于访问。在任何情况下,我认为值得指出的是,嵌套的<代码> InnerClass < /> C++只能通过引用<代码>和<代码>访问一个非静态成员变量,该代码为<代码> OuterClass < /COD>的特定实例,这样我的NOBOS不会试图破坏C++的规则。