Xin xem đoạn code ví dụ dưới đây:Chức năng thành viên lớp lồng nhau không thể truy cập chức năng của lớp kèm theo. Tại sao?
class A
{
private:
class B
{
public:
foobar();
};
public:
foo();
bar();
};
Trong hạng A thực hiện & B:
A::foo()
{
//do something
}
A::bar()
{
//some code
foo();
//more code
}
A::B::foobar()
{
//some code
foo(); //<<compiler doesn't like this
}
Cờ biên dịch các cuộc gọi đến foo() trong phương pháp foobar(). Trước đó, tôi đã có foo() là hàm thành viên riêng của lớp A nhưng thay đổi thành công khai giả định rằng hàm B không thể nhìn thấy nó. Tất nhiên, nó không giúp được gì. Tôi đang cố gắng tái sử dụng chức năng được cung cấp bởi phương pháp của A. Tại sao trình biên dịch không cho phép chức năng này gọi? Như tôi thấy, chúng là một phần của cùng một lớp bao quanh (A). Tôi nghĩ rằng vấn đề trợ năng cho meebers lớp lồng nhau cho kèm theo lớp trong tiêu chuẩn C++ đã được giải quyết.
Làm thế nào tôi có thể đạt được những gì tôi đang cố gắng làm mà không viết lại cùng một phương thức (foo()) cho B, giữ B lồng trong A?
Tôi đang sử dụng trình biên dịch VC++ ver-9 (Visual Studio 2008). Cảm ơn sự giúp đỡ của bạn.
+1, chỉ cần một nitpick - 'parent' có lẽ không phải là tên tốt nhất cho biến thành viên ở đây - dễ nhầm lẫn với thừa kế. –
Tôi chỉ muốn đề cập rằng có một lý do thiết kế rất tốt cho lớp B lồng nhau có tham chiếu đến lớp A. – manifest
Cảm ơn bạn đã giải thích bằng ví dụ. Tiêu chuẩn C++ 11.8, mà tôi đoán rằng nó đã thay đổi, nói về việc truy cập thành viên lớp bằng lớp lồng nhau. Tôi biết rằng gcc cho phép truy cập bởi lớp lồng nhau (Tôi chắc chắn về nó) nhưng trình biên dịch MS VC không. Hmm ... thú vị. – Rahul