Vì vậy, tôi có một lớp A, nơi tôi muốn gọi một số chức năng lớp B. Vì vậy, tôi bao gồm "b.h". Nhưng, trong lớp B, tôi muốn gọi một hàm lớp A. Nếu tôi bao gồm "a.h", nó kết thúc trong một vòng lặp vô hạn, phải không? Tôi có thể làm gì với nó?hai lớp có thể nhìn thấy nhau bằng C++ không?
Trả lời
Mỗi lớp (A và B) phải có tệp tiêu đề và tệp triển khai.
Mỗi tập tin tiêu đề (ví dụ như A.h
) không nên bao gồm các tập tin tiêu đề khác (ví dụ B.h
) nhưng có thể bao gồm một tham chiếu về phía trước để các lớp khác (ví dụ như một tuyên bố như class B;
), và sau đó có thể sử dụng con trỏ và/hoặc tham chiếu đến lớp khác trong khai báo của nó (ví dụ: class A
có thể chứa một thành viên dữ liệu B*
và/hoặc làm tham số phương thức).
Mỗi tệp CPP (ví dụ: A.cpp
) có thể bao gồm nhiều tệp tiêu đề (ví dụ: A.h
và B.h
). Chúng tôi khuyên mỗi tệp CPP nên bao gồm tệp tiêu đề của chính nó trước tiên (ví dụ: A.cpp
phải bao gồm A.h
và sau đó B.h
, trong khi B.cpp
phải bao gồm B.h
và sau đó A.h
).
Mỗi tệp tiêu đề chỉ nên chứa khai báo chứ không phải định nghĩa của lớp: ví dụ: nó sẽ liệt kê chữ ký của các phương thức của lớp, chứ không phải là các phương thức/triển khai phương thức. tệp .cpp
, không có trong tệp tiêu đề). Bởi vì các tệp tiêu đề không chứa chi tiết triển khai, do đó chúng không phụ thuộc vào (không cần phải xem) chi tiết của các lớp khác; nhiều nhất họ cần phải biết rằng, ví dụ, B
là tên của một lớp: mà nó có thể lấy từ một tờ khai chuyển tiếp, thay vì bao gồm một tệp tiêu đề trong một tệp tiêu đề khác.
Chỉ đặt các khai báo hàm thành viên trong các tệp tiêu đề (.h) và đặt định nghĩa hàm thành viên vào tệp thực thi (.cpp). Sau đó, các tệp tiêu đề của bạn không cần bao gồm lẫn nhau và bạn có thể bao gồm cả hai tiêu đề trong tệp triển khai.
Đối với trường hợp khi bạn cần phải tham khảo các lớp khác trong chữ ký thành viên là tốt, bạn có thể sử dụng một tờ khai chuyển tiếp:
class A;
này cho phép bạn sử dụng con trỏ và tham khảo các loại (A*
và A&
), mặc dù không A
. Nó cũng không cho phép bạn gọi các thành viên.
Ví dụ:
// a.h
struct B; // forward declaration
struct A {
void foo(B* b); // pointers and references to forward-declared classes are ok
};
// b.h
struct A; // forward declaration
struct B {
void bar(A& a); // pointers and references to forward-declared classes are ok
};
// a.cpp
#include "a.h"
#include "b.h"
void A::foo(B* b) {
b->bar(*this); // full declaration of B visible, ok to call members now
}
// b.cpp
#include "a.h"
#include "b.h"
void B::bar(A& a) {
a.foo(this); // full declaration of A visible, ok to call members now
}
Bạn cũng có thể sử dụng forward declarations để có được xung quanh vấn đề này.
Thử đặt #ifndef
, #define
và #endif
xung quanh tệp .h của bạn.
- 1. Các lớp Xcode không thể "nhìn thấy" nhau
- 2. Các nút Erlang không thể nhìn thấy nhau
- 3. Phần có thể nhìn thấy có thể nhìn thấy của văn bản
- 4. Làm gói được bảo vệ bằng java lớp có thể nhìn thấy trong gói mẹ
- 5. C# UserControl Tài sản có thể nhìn thấy
- 6. Visual C++ - không thể nhìn thấy lỗi bên ngoài nào
- 7. Có thể sử dụng các lớp .NET có thể nhìn thấy được với đăng ký COM miễn phí không?
- 8. Jython nói "Không có nhà thầu có thể nhìn thấy cho lớp học"
- 9. HorizontalScrollView có thể nhìn thấy trẻ em
- 10. Trục trặc có thể nhìn thấy Datepicker?
- 11. Dịch vụ Windows không thể nhìn thấy semaphore có tên
- 12. Knockout có thể nhìn thấy liên kết không làm việc
- 13. EF trong một UserControl không thể nhìn thấy app.config?
- 14. Tạo một assembly COM có thể nhìn thấy từ managed C++ (C++/CLI)
- 15. QLineChỉnh sửa chiều rộng có thể nhìn thấy Cài đặt?
- 16. Automation Lỗi khi instantiating một Net COM có thể nhìn thấy lớp
- 17. Xác định các đỉnh có thể nhìn thấy trong OpenGL
- 18. Tại sao tôi không thể nhìn thấy 'lớp con UIViewController' trong Cocoa touch cho ios/macos?
- 19. Java; Bắt insets trước frame có thể nhìn thấy
- 20. Không thể tìm thấy lớp HttpServerUtility trong System.Web trong C#
- 21. Wrapping GridView văn bản mà không có một không gian có thể nhìn thấy
- 22. Android - Phát hiện bàn phím có thể nhìn thấy?
- 23. Fancybox 2 mũi tên điều hướng có thể nhìn thấy
- 24. BeautifulSoup Grab Văn bản trang web có thể nhìn thấy
- 25. yếu tố Đếm li có thể nhìn thấy với jQuery
- 26. JavaScript - Văn bản có thể nhìn thấy của DIV
- 27. Cảnh báo C4099: loại tên được nhìn thấy lần đầu tiên bằng cách sử dụng 'lớp' bây giờ nhìn thấy bằng cách sử dụng 'struct' (MS VS 2k8)
- 28. CSS: tràn-y: cuộn; overflow-x: có thể nhìn thấy
- 29. Đoạn trước có thể nhìn thấy dưới đoạn mới
- 30. JavaScript có thể nhìn thấy trong Firebug, không thể tiếp cận trong mã
Bài đăng này không trả lời câu hỏi .. –