内部类访问

时间:2011-07-14 13:13:15

标签: c++ nested-class

可以用另一个类(内部类)的方法编写一个类,访问方法变量吗?我的意思是在下面的代码中:

class A
{
  void methodA( int a )
  {
    class B
    {
      void processA()
      {
         a++;
      }
    };
     std::cout<<"Does this program compile?";
     std::cout<<"Does the value of the variable 'a' increments?";
  };

};

这是合法的吗?'a'的值增加了吗?请提出建议。

谢谢, 帕。

2 个答案:

答案 0 :(得分:4)

不合法
class B本地课程methodA()

class B无法访问封闭函数的非静态“自动”局部变量。但它可以从封闭范围访问静态变量。

本地类可以访问的内容有几个限制。

以下是C ++标准的参考:

9.8本地班级声明[class.local]

  1. 可以在函数定义中定义类;这样的类叫做本地类。本地类的名​​称是其封闭范围的本地名称。本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。本地类中的声明只能使用类型名称,静态变量,外部变量和函数以及封闭范围内的枚举器。
  2. [实施例:

    int x;
    void f()
    {
       static int s ;
       int x;
       extern int g();
    
       struct local {
          int g() { return x; } // error: x is auto
          int h() { return s; } // OK
          int k() { return ::x; } // OK
          int l() { return g(); } // OK
       };
    // ...
    }
    local* p = 0; // error: local not in scope
    

    -end example]

    2。封闭函数对本地类的成员没有特殊访问权限;它遵守通常的访问规则(第11条)。如果定义了本地类的成员函数,则应在其类定义中定义它们。

    3。如果类X是本地类,则嵌套类Y可以在类X中声明,稍后在类X的定义中定义,或者稍后在与类X的定义相同的范围内定义。嵌套在本地类中的类是当地班级。

    4。本地类不应具有静态数据成员。

答案 1 :(得分:1)

简短的回答,没有。 C ++中的本地类无法访问其封闭的函数变量(有一些注意事项)。您可以阅读有关C ++本地类here的更多信息,还可以查看此nice SO answer。强调:

在函数定义中声明了本地类。本地类中的声明只能使用类型名称,枚举,封闭范围内的静态变量,以及外部变量和函数。

int x;                         // global variable
void f()                       // function definition
{
      static int y;            // static variable y can be used by
                               // local class
      int x;                   // auto variable x cannot be used by
                               // local class
      extern int g();          // extern function g can be used by
                               // local class

      class local              // local class
      {
            int g() { return x; }      // error, local variable x
                                       // cannot be used by g
            int h() { return y; }      // valid,static variable y
            int k() { return ::x; }    // valid, global x
            int l() { return g(); }    // valid, extern function g
      };
}

int main()
{
      local* z;                // error: the class local is not visible
// ...}