Hãy giúp tôi hiểu tại sao có thể cho hàm thành viên của lớp trả về một đối tượng lớp lồng nhau riêng và tại sao nó có thể gọi hàm thành viên trên lớp lồng nhau riêng đó, ví dụ :Truy cập vào lớp lồng nhau được trả về từ hàm thành viên
class Y
{
class X
{
public:
void f() { cout << "Hello World" << endl; }
};
public:
X g() { return X(); }
};
void h()
{
Y::X x; // Error, as expected: class Y::X is private.
x.f(); // Error.
Y y; // OK.
y.g().f(); // OK. But why???
}
Tôi đã thử nghiệm với GCC và Visual C++ và dòng cuối cùng biên dịch trên cả hai. Tôi dường như không thể tìm thấy bất cứ điều gì trong tiêu chuẩn C++ mà sẽ làm cho điều này hợp lệ. Bất kỳ ý tưởng tại sao điều này hoạt động?
Edit:
Một quan sát:
void i()
{
Y y;
Y::X x2 = y.g(); // Error: class Y::X is private
x2.f(); // Error
auto x3 = y.g(); // OK
x3.f(); // OK
}
Cả hai chức năng đều là 'công khai' và bạn thực sự không sử dụng 'X' ở bất kỳ đâu. –
Định nghĩa 'X' là riêng tư, nhưng hàm' g() 'là công khai. Vì vậy, không có vấn đề gì cả. – Chiel