2010-10-14 24 views
5
void foobar(){ 
    int local; 
    static int value; 
    class access{ 
      void foo(){ 
       local = 5; /* <-- Error here */ 
       value = 10; 
      } 
    }bar;  
} 
void main(){ 
    foobar(); 
} 

Tại sao không truy cập vào local bên trong foo() biên dịch? OTOH Tôi có thể dễ dàng truy cập và sửa đổi biến tĩnh value.Sự cố truy cập ở lớp địa phương

+4

Kiểu trả về của 'main()' phải luôn là' int'. –

Trả lời

1

Bên trong lớp địa phương, bạn không thể sử dụng/truy cập các biến tự động từ phạm vi kèm theo. Bạn chỉ có thể sử dụng các biến tĩnh, các biến ngoài, kiểu, enums và các hàm từ phạm vi kèm theo.

0

Hãy local tĩnh và sau đó bạn sẽ có thể truy cập vào nó

1

Từ tài liệu tiêu chuẩn Sec 9.8.1,

Một lớp học có thể được khai báo trong định nghĩa hàm; một lớp như vậy được gọi là một lớp địa phương. Tên của một lớp địa phương là địa phương đến phạm vi kèm theo của nó. Lớp địa phương nằm trong phạm vi của phạm vi bao quanh và có cùng quyền truy cập vào các tên bên ngoài chức năng cũng như chức năng kèm theo. Các khai báo trong một lớp địa phương chỉ có thể sử dụng các tên kiểu, các biến tĩnh, các biến và hàm bên ngoài, và các điều tra từ phạm vi kèm theo.

Một ví dụ từ các tài liệu tiêu chuẩn riêng của mình,

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 
}; 
// ... 
} 

Do đó truy cập vào một biến tự động bên trong một lớp địa phương là không thể. Hãy đặt giá trị cục bộ của bạn thành static hoặc giá trị toàn cục, tùy theo điều kiện nào là thích hợp cho thiết kế của bạn.

0

Có thể vì bạn có thể khai báo đối tượng nằm ngoài phạm vi chức năng.

foobar() called // local variable created; 
Access* a = new Access(); // save to external variable through interface 
foobar() finished // local variable destroyed 

... 


savedA->foo(); // what local variable should it modify? 
Các vấn đề liên quan