C ++嵌套类 - 内/外关系

时间:2013-01-30 15:12:14

标签: c++

我在社区内外阅读了一些关于嵌套类的帖子,我很困惑。

据我所知,在 C ++中,嵌套类与单独/独立类没有任何不同。

当我试图更好地理解conecpt时,我编写了一个简单的代码,我发现内部类可以访问外部类而不会从外部类中获得友谊。

例如:

class Outer {
private : // default access modifier
    int x;
    static int sx;
public:
    class Inner {
    public:
        void changeOuterDataMemberValues(int value) {
            sx = value; // changes the private static data member of Outer.

            Outer out;
            out.x = value; // changes the private data member via object (not via class!)
        }
        void printMyOuterDataMember()  {
            cout << sx; // prints the private data member of Outer.
        }
    };
};


class Lonesome {
    void tryingToChangeDataMemberValue(int value) {
        Outer::sx = value; // cannot change the private static data member of Outer.
    }
};

int Outer::sx;

您可以看到嵌套在Outer类中的Inner类可以访问其(Outer类)数据成员,而Lonesome作为独立类无法访问Outer类数据成员。

如果这是一个重复或愚蠢的问题我很抱歉,但我只是想和你们确认一个嵌套类和独立类之间有区别(两个不同的类没有有内在/外在的关系)。

谢谢大家, Syndicator =]

3 个答案:

答案 0 :(得分:21)

在这方面,C ++ 03和C ++ 11之间存在差异。所以答案取决于您使用的编译器。

如果您使用符合C ++ 03的编译器,那么:

嵌套类无法访问封闭类的所有成员。

如果您正在使用符合C ++ 11的编译器,那么:

嵌套类可以访问封闭类的所有成员。嵌套类被视为该类的另一个成员。

C ++ 03标准11.8嵌套类:
§1

  

嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经为封闭类授予友谊的类或函数;应遵守通常的访问规则。

C ++ 11 Standard 11.7嵌套类:

  

嵌套类是成员,因此具有与任何其他成员相同的访问权限。

答案 1 :(得分:3)

从标准第11.7节开始:

  

1 - 嵌套类是成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类[...]

的成员没有特殊访问权限

因此,嵌套(“内部”)类实际上是封闭类的朋友。

答案 2 :(得分:2)

你自己回答了你的问题:

  

您可以看到嵌套在Outer类中的Inner类可以访问其(Outer类)数据成员,而Lonesome作为独立类无法访问Outer类数据成员。

注意与C ++中的Java相反,您无法访问Outer类的非静态成员。

通常的做法是将Outer课程引用到Inner课程。

class Outer {
    private : // default access modifier
    int x;
    static int sx;
public:
    class Inner {
    public:
        Inner( Outer & o ) : m_outer( o ) {}
        void changeOuterDataMemberValues(int value) {
            sx = value; // changes the private static data member of Outer.

            //Outer out;
            //out.x = value; // changes the private data member via object (not via class!)
            m_outer.x = value; // <---------
        }
        void printMyOuterDataMember()  {
            cout << sx; // prints the private data member of Outer.
            cout << m_outer.x;
        }
    private:
        Outer & m_outer;
    };
};