John đưa ra lời khuyên tốt, nhưng đây là một chút nền tảng hơn trên whys, nơi lưu trữ và ngoại lệ.
Có hai mục tiêu để tránh nhập tiêu đề vào tiêu đề: cải thiện thời gian xây dựng gia tăng và tránh phụ thuộc vòng tròn. Nếu bạn nhập vào A.h
B.h
và nhập B.h
vào C.h
, sau đó mỗi khi bạn thay đổi bất cứ điều gì trong A.h
, bạn phải biên dịch lại C.m
, ngay cả khi C.m
làm cho không có sử dụng bất kỳ trong những điều quy định tại A.h
. Điều này có thể dẫn đến sự lộn xộn thực sự khủng khiếp và không cần thiết, đặc biệt nếu bạn có các tiêu đề thay đổi thường xuyên (như thường thấy trong các giai đoạn phát triển ban đầu).
Mục tiêu đầu tiên là đáng khen ngợi, nhưng đối với các dự án nhỏ, những người quan tâm? Bạn đã có một Quad-core Pro và một bản dựng hoàn chỉnh mất một vài phút, phải không? Nhưng bạn vẫn phải lo lắng về vấn đề thứ hai: phụ thuộc vòng tròn. Tài liệu tham khảo A.h
lớp B
và B.h
tham chiếu lớp A
. Điều này thực sự có thể xảy ra khá thường xuyên và có thể leo vào một hệ thống khá ngây thơ. Một đối tượng bộ sưu tập có thể tham chiếu kiểu của các đối tượng nó chứa, và các đối tượng có thể tham chiếu kiểu của đối tượng thu thập. Tất cả những gì nó cần là một tham chiếu đơn vì một số phương thức lấy hoặc trả về kiểu đó. Nếu bạn có tiêu đề nhập các tiêu đề khác, khả năng điều này xảy ra nhanh chóng tiếp cận sự thống nhất. Bạn kết thúc với nhập khẩu đệ quy, và các lỗi biên dịch thời gian có thể là tâm-thổi. "Tôi biết rằng typdef được xác định!Nó ở ngay đó! Nó đã được nhập! "Nhưng, nó chưa được phân tích cú pháp khi bạn nhập tiêu đề này. Đây là nguyên nhân gây ra lỗi của bạn ở trên. bạn nên), tránh nhập tiêu đề vào các tiêu đề ... trừ ....
một số tiêu đề bạn có nhập khẩu. lớp cha của bạn dĩ nhiên rồi. các tập tin định nghĩa một @protocol
bạn thực hiện hoặc typedef
bạn sử dụng. Vì vậy, yeah, bạn phải bao gồm những người đó.
Và điều gì về tiêu đề hệ thống? Vâng, họ sẽ không bao giờ ause churn, và rõ ràng là họ sẽ không gây ra nhập khẩu đệ quy, vì vậy họ đang tốt. Tôi không khuyến khích mọi người sử dụng các khai báo chuyển tiếp @class
cho những thứ trong tiêu đề hệ thống. Nó tạo thêm công việc cho người dùng tiêu đề của bạn không có giá trị. Để vệ sinh tiêu đề tốt, hãy nhớ đính kèm tiêu đề hệ thống trong các dấu ngoặc vuông < > và tiêu đề của bạn trong "dấu ngoặc kép".
Vì vậy, nó không phải là một câu hỏi tầm thường, nhưng quy tắc đơn giản là: tránh nhập tiêu đề người dùng vào các tiêu đề người dùng khác bất kỳ lúc nào trình biên dịch sẽ cho phép bạn.
Nguồn
2009-12-15 14:37:06
Điều gì về 'typedef's và' protocol'? – Joost
bạn sẽ không biết về một hướng dẫn, hoặc một mẫu mã sử dụng điều này? – gargantuan