2012-07-17 48 views
8

thể trùng lặp:
In C++ why have header files and cpp files?Confused về mục đích thực sự của tập tin tiêu đề trong C++

Tôi không hoàn toàn nhận được C++ file header, vì hai lý do mâu thuẫn:

  1. Tôi nghĩ mục đích của tệp tiêu đề nói chung là tách riêng giao diện và triển khai. Nói cách khác, máy khách sử dụng tệp tiêu đề để tìm hiểu cách sử dụng lớp, nhưng không phải lo lắng về cách lớp thực sự thực hiện chức năng này trong nội bộ.

  2. Tại sao, sau đó, là biến riêng tư của lớp C++ được chỉ định trong tệp tiêu đề của nó?

Dường như với tôi rằng có biến tin trong file header vi phạm sự tách biệt của giao diện và thực hiện. Trực giác, tôi nghĩ sẽ có ý nghĩa hơn đối với các biến riêng tư trong tệp nguồn, vì đây là tệp không được tiếp xúc với thế giới bên ngoài.

Có lẽ tôi chỉ hiểu nhầm mục đích của tệp tiêu đề và 1. ở trên hoàn toàn sai? Trong những cách?

+0

Trường hợp bạn nhận được 1. Từ? – Robottinosino

+0

Bên cạnh các hàm 'friend', tôi đặt cược nó chỉ là giới hạn kỹ thuật cho trình biên dịch để xác định kích thước của lớp. – Mysticial

+0

@DaveSwersky Điều đó không trả lời câu hỏi thứ hai của OP, "Tại sao, sau đó, là các biến riêng của một lớp C++ được chỉ định trong tệp tiêu đề của nó?" – Mysticial

Trả lời

9

C++ phân biệt giữa khai báo và định nghĩa các hàm và lớp. Nói chung một tệp tiêu đề C++ chứa khai báo của một lớp. Vì không có khai báo một phần nào được cho phép, tệp tiêu đề cần chứa khai báo lớp hoàn chỉnh bao gồm tất cả các thành viên riêng (các biến và các hàm thành viên).

Nếu bạn muốn ẩn hoàn toàn triển khai từ công chúng, bạn có thể sử dụng pimpl idiom để đạt được điều này.

6

Mục đích chức năng chính của tệp tiêu đề C++ là trong ngôn ngữ C++ không có nhập mô-đun hoặc bất kỳ thứ gì tương tự tồn tại trong các ngôn ngữ khác. Cách duy nhất để trình biên dịch biết về các loại, chức năng, vv từ các tệp khác là dán mã vào tệp nguồn hiện tại bằng cách sử dụng #include.

Về mặt lý thuyết, bạn cũng có thể đặt tất cả mã nguồn của mình vào tiêu đề và chỉ có một tệp nguồn bao gồm tất cả các tiêu đề. Lý do điều này thường không được thực hiện là gấp đôi. Đầu tiên, phải mất nhiều thời gian để biên dịch (một mối quan tâm đáng kể đối với một số dự án) và bất kỳ thay đổi nào đối với bất kỳ tệp nào sẽ dẫn đến việc biên soạn lại hoàn toàn dự án. Thứ hai, việc triển khai thực hiện vào một tệp nguồn thực tế giúp tách riêng giao diện khỏi việc triển khai, ngay cả khi một phần của việc triển khai vẫn được chỉ định trong tệp tiêu đề.

Lưu ý rằng các phương thức nội tuyến trong các tiêu đề cũng đi bộ một chi tiết chi tiết triển khai tốt được hiển thị cho công chúng/khách hàng của lớp học của bạn.

Nếu bạn thực sự muốn tách biệt hoàn toàn giao diện khỏi triển khai (có giá trị nhất định), cách C++ để làm như vậy là sử dụng thành ngữ pimpl. Sử dụng thành ngữ đó tất cả các dữ liệu cá nhân được ẩn đi trong tệp nguồn và chỉ một giao diện trừu tượng được cung cấp cho công chúng. Ngoài ra, sử dụng mẫu giao diện không phải là giao diện ảo (NVI) có thể giúp cô lập khách hàng hơn nữa từ các thay đổi giao diện.

0

Trong C/C++, một mục đích của tệp tiêu đề là cho phép nhiều đơn vị dịch sử dụng các loại có cùng định nghĩa mà không cần sao chép định nghĩa trên nhiều tệp.Một phần của định nghĩa của một lớp là các thành viên riêng của nó.

3

Mục đích của tệp tiêu đề là cung cấp cho trình biên dịch thông tin cần chia sẻ định nghĩa giữa các đơn vị biên dịch (tệp nguồn .cpp). Đó là một thứ cơ khí, không phải là một thứ triết học.

Ví dụ, biến thành viên riêng cần được khai báo vì chúng xác định kích thước của đối tượng và trình biên dịch cần biết kích thước khi phân bổ đối tượng.

+0

Sẽ không phải là thuật ngữ chính xác để "chia sẻ khai báo" giữa các đơn vị biên dịch? Nó bị nhầm lẫn thường xuyên đủ, những gì các phương tiện tuyên bố và định nghĩa là ... –

+0

@ g-makulik, tôi đã sử dụng "định nghĩa" trong ý nghĩa tiếng Anh của từ, không phải là cách sử dụng C++ chính thức. Và nó chắc chắn có thể bao gồm các định nghĩa trong tiêu đề, với các mẫu ví dụ nó gần như là bắt buộc. –

+0

tại sao chỉ có các biến thành viên riêng tư? – zgulser

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