Khi bạn khai báo hàm bạn cho 2 class, nếu bạn chưa có kinh nghiệm bạn sẽ dễ gặp lỗi inaccessible.
Dấu hiệu theo ví dụ bên dưới:
- Bạn đã khai báo friend void test(Matrix a, Vector b); trong class Matrix
- Bạn đã khai báo friend void test(Matrix a, Vector b); trong class Vector
- Nhưng chỉ 1 trong 2 truy cập được vùng private
Cách khắc phục
- Bạn khai báo tên của 2 class Matrix, và Vector ở đầu chương trình chính, sau đó viết nội dung class bên dưới.
- Nếu bạn chia file cho từng class, thì hãy làm như sau:
– Trong file .h của file này bạn khai báo class kia, mục đích báo cho trình biên dịch biết class kia có tồn tại.
VD: ở Matrix.h tôi khai báo Class Vector; Và trong Vector.h tôi khai báo class Matrix.h;
Một ví dụ khác đơn giản hơn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<iostream> using namespace std; class B; //defined later class A; //correction (A also need be specified) void add(A,B); class A{ private: int a; public: A(){ a = 100; } friend void add(A,B); }; class B{ private: int b; public: B(){ b = 100; } friend void add(A,B); }; void add (A Aobj, B Bobj){ cout << (Aobj.a + Bobj.b); } main(){ A A1; B B1; add(A1,B1); return 0; } |
Bạn có thể tham khảo thêm tại đây: http://stackoverflow.com/questions/18404299/can-2-classes-share-a-friend-function
Bài viết liên quan
- [Học OOP] Bài 3: Lớp trong lập trình hướng đối tượng
- Giải đề thi Lập trình hướng đối tượng UIT – Đề HK2 2016-2017
- [Lập trình hướng đối tượng – OOP] Bài tập cơ bản về lớp (class) – Thực hành 2
- [Học OOP] Bài 9: Hiểu kế thừa như thế nào cho đúng trong hướng đối tượng (Phần 2)
- [Học OOP] Bài 8: Kế thừa trong lập trình hướng đối tượng c++ (Phần 1)
- [Học OOP] Bài 7: Overload toán tử trong Lập trình hướng đối tượng c++
- [BFS] – SPOJ PPATH
- [Học OOP] Bài 6: Hàm bạn, lớp bạn trong hướng đối tượng c++
- [Học OOP] Bài 5: Static trong hướng đối tượng c++
- [Học OOP] Bài 4: Constructor, destructor và Copy constructor trong hướng đối tượng c++