2013-08-28 56 views
9

Tôi có lớp ngoài A. Nó có một phương thức A::fun. Trong phương pháp này, nó có một lớp địa phương hoặc bên trong B. Câu hỏi của tôi là: Có phải là B một người bạn của A?Là một lớp học địa phương trong một phương pháp của một lớp học một người bạn của lớp này?

Tôi nghĩ là không. Đúng không? Nếu vậy, tôi nghĩ hãy để lớp B một người bạn của A rất có lợi vì B có thể truy cập vào các thành viên riêng tư và được bảo vệ của A. Và hơn nữa, kể từ khi B là địa phương trong một phương pháp, nó không thể truy cập bởi những người khác và do đó an toàn như một người bạn của A. Cách làm việc xung quanh để cho phép B truy cập vào các thành viên riêng tư và được bảo vệ của A?

+4

Nếu bạn không nói rõ ràng họ là bạn thì họ không phải là bạn bè. – andre

+1

@andre Và tôi không nghĩ rằng có một cách cú pháp để kết bạn với họ. – Angew

Trả lời

14

Không có họ không phải là bạn bè.

Nhưng các lớp địa phương có cùng quyền truy cập vào các tên bên ngoài hàm làm chính hàm đó.

Tiêu chuẩn nói:

9,8 tờ khai lớp địa phương [class.local]

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à cục bộ với phạm vi kèm theo của nó. Lớp cục bộ 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 hàm cũng như hàm kèm theo. Tuyên bố trong một lớp địa phương sẽ không sử dụng odr (3.2) một biến với thời gian lưu trữ tự động từ một phạm vi kèm theo.

Sự khác biệt lớn về số lượng là lớp địa phương của bạn sẽ chỉ có thể truy cập được bên trong hàm.

Nhưng sau đó:

  • Một người bạn của một lớp là một hàm hoặc lớp đó được đưa ra phép sử dụng tên thành viên tư nhân và bảo vệ khỏi lớp.
  • 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 hàm cũng như chức năng kèm theo. Nghĩa là, nó có thể truy cập vào các thành viên được bảo vệ và riêng tư của lớp mà hàm đó thuộc về.
6

Không có họ không phải là bạn bè. Nhưng nó có quan trọng không?
Không thực sự! xem xét các sự kiện này:

  1. Trong chức năng thành viên, bạn sẽ luôn có quyền truy cập vào các thành viên của lớp mà chức năng đó thuộc về.
  2. Bạn không thể truy cập lớp địa phương ở bất kỳ nơi nào ngoài chức năng.

Vì vậy, nó hầu như không quan trọng nếu chúng là bạn bè hay không. Bạn sẽ luôn đề cập đến các thành viên lớp bên ngoài bên trong hàm thành viên của nó.

Online Sample:

class A 
{ 
    int i; 
    void doSomething() 
    { 
     class B{public: int ii;}; 
     B obj; 
     obj.ii = i; 
    } 
}; 

int main() 
{ 
    return 0; 
} 
+0

Một lý do kỹ thuật cho downvote sẽ được đánh giá cao. –

+1

Tôi đã không bỏ phiếu, nhưng sự giải thích của tôi về tình bạn trong câu hỏi là theo một hướng khác: Có thể 'B' thấy các thành viên ngoài công lập của 'A' không? – juanchopanza

+0

@juanchopanza: Những vấn đề khó vì tên lớp cục bộ là cục bộ với phạm vi bao quanh, Người ta không thể sử dụng tên này ngoài phạm vi địa phương và phạm vi cục bộ nằm trong hàm thành viên để luôn có quyền truy cập vào các thành viên lớp bên ngoài. –

3

này biên dịch trong Clang:

class A { 
    typedef int Int; 
    void fn(); 
}; 

void A::fn() { 
    class B { 
    Int i; 
    }; 
} 

Các lớp bên có quyền truy cập cho các thành viên riêng của A, nhưng không phải vì nó là một người bạn, nhưng vì nó được coi là một hội viên. Vì các thành viên của một lớp có quyền truy cập vào các thành viên riêng, điều này bao gồm các lớp bên trong cũng như các lớp hàm cục bộ của địa phương.

Xem [class.access] p2.

+1

+1 để giải thích nó không phải là một người bạn nhưng _still_ có quyền truy cập vào các thành viên riêng. – Andy

Các vấn đề liên quan