2009-05-20 24 views
9

Tôi đã được dạy để giữ các định nghĩa và mã lớp riêng biệt.C++: Khi nào có thể chấp nhận mã trong tệp tiêu đề?

Tuy nhiên, tôi đã thấy các tình huống mà mọi người thường sẽ bao gồm một số bit mã trong tiêu đề, ví dụ: các phương thức truy cập đơn giản trả về một tham chiếu của một biến.

Bạn vẽ đường kẻ ở đâu?

Trả lời

15

Nói chung, những thứ bạn muốn trình biên dịch nội tuyến hoặc mã templated. Trong cả hai trường hợp, mã phải có sẵn cho trình biên dịch ở mọi nơi được sử dụng, vì vậy bạn không có lựa chọn nào. Tuy nhiên, hãy lưu ý rằng bạn đặt càng nhiều mã vào tệp tiêu đề thì càng mất nhiều thời gian để biên dịch - và bạn càng thường xuyên phải chạm vào các tệp tiêu đề, do đó gây ra phản ứng dây chuyền của các bản dựng chậm :)

Thông tin chi tiết
0

Tùy thuộc vào bạn. Boost đặt gần như tất cả mã của nó trong tiêu đề ... và chúng là một thư viện được kính trọng.

+4

Tăng cường cũng là một người dùng nặng của các mẫu và lập trình meta mẫu - nghĩa là rất nhiều mã phải có sẵn tại trang web khởi tạo mẫu. Vì vậy, chúng là một trường hợp đặc biệt ở đây ... – bdonlan

5

Một lý do để giảm thiểu số lượng mã trong tiêu đề là giảm thiểu số lượng mã được biên dịch lại khi thay đổi triển khai. Nếu bạn không quan tâm về điều đó, bạn có thể có bất kỳ số lượng mã nào trong tiêu đề.

Đôi khi có mã trong tiêu đề chỉ được thực hiện cố ý để hiển thị mã - ATL thực hiện điều đó đối với nhiều lần.

1

Tôi sẽ gắn mã trong các tệp .c và .cpp và phần đầu tệp trong tệp .h, .hpp. Lý do là khi tôi tải xuống tệp .tar.gz hoặc mã nguồn, tôi luôn tìm kiếm tệp .h cho nội dung tiêu đề và tệp .cpp cho nguồn. Nhiều người quen với điều đó nên tôi nghĩ bạn nên giữ phong cách đó.

1

Khi bạn có mã trong tệp tiêu đề cho các phương thức getter/setter đơn giản, ít nhiều là tốt vì bạn muốn tiết kiệm thời gian làm việc vì bảo trì mã (nhập cùng một phương thức trong tệp đầu trang và tệp triển khai) hoặc bởi vì bạn thực sự muốn phương thức nội tuyến do chức năng cuộc gọi trên cao trong những thời điểm quan trọng.

Bạn sẽ không chỉ bị xây dựng chậm hơn, thời gian liên kết có thể là lớn nếu bạn có nhiều lớp hiển thị nhiều hơn hoặc ít hơn ở mọi nơi.

Một mặt khác với mã trộn giữa tệp tiêu đề và tệp triển khai có thể đọc được. Nếu bạn nhất quán khai báo trong tệp tiêu đề và luôn giữ mã trong tệp triển khai, việc giữ cùng thứ tự giữa các phương thức sẽ dễ dàng hơn. Không có khoảng trống thiếu nếu bạn biết những gì tôi có ý nghĩa.

Chúc mừng!

1

Cũng lưu ý rằng bạn có thể kết thúc với một số tác dụng phụ lạ nếu bạn đặt mã vào tệp tiêu đề và không cẩn thận với Makefile của mình. Tôi đã từng có một lỗi do mã tôi đã thay đổi trong một tiêu đề đã được biên dịch lại thành một số tệp nhưng không được biên dịch lại bởi vì các phụ thuộc không chính xác trong Makefile. Đây không phải là vấn đề lớn nếu bạn tự động tạo Makefile của mình.

5

Khi phát triển một dự án C++ lớn, bạn cần cảnh giác để làm cho mỗi cặp tệp .CPP có ít tệp tiêu đề nhất có thể.

Vì vậy, tôi có một quy tắc đơn giản để "vẽ đường":

Nếu, bằng cách nội tuyến thực hiện, tập tin tiêu đề của bạn bây giờ cần bao gồm một tập tin tiêu đề bổ sung, bạn nên di chuyển thi ra khỏi header và vào tệp .CPP.

Tất nhiên, đó không phải là lý do duy nhất không trực tiếp, nhưng đây là một ví dụ xác định của một dòng không nên vượt qua.

1

Bạn sẽ muốn mã trong tiêu đề nếu bạn muốn 'nội tuyến' mã. Nếu không, có nhiều lợi thế hơn để gắn bó thực hiện trong cơ thể.

4
  1. chức năng Inline
  2. Một/Hai phương pháp dòng
  3. Templates

Nhưng khi phần đầu phát triển về kích thước, nó sẽ mất nhiều thời gian hơn để biên dịch, vì vậy nó rất hữu ích để sử dụng các tiêu đề được biên dịch trước.

Các vấn đề liên quan